ASP.NET Core MVC可以同时使用@Html.DisplayFor和@Html.EditorFor吗?

Can ASP.NET Core MVC simultaneously use @Html.DisplayFor and @Html.EditorFor?

我正在尝试使用 ASP.NET Core 6 MVC 进行前端开发,希望它看起来像这样:


因为使用 ASP.NET Web Forms 时 使用 ajax post 后端显示数据和输入文本,

我使用三个模型的数据,有两个模型(STAFF、DEPARTMENT)使用显示数据,Cascading Dropdown

一个模型(STAFF_PERMISSION)插入数据,使<input type="text">

我曾经同时想要它 @Html.DisplayFor@Html.EditorFor , 但不允许或只有 ajax 可用

因为 @Html.EditorForList<Staff_To_Show>

上找不到 StaffPermission

HomeController.cs


    [HttpGet("[action]")]
    public ActionResult StaffPermission()
    {
        var queryDepar = dbContext.Departments.Join(dbContext.staff,
        o => o.DepartmentNumber, p => p.DepartmentNumber, (o, p) =>
              new Staff_To_Show
              {
                  DepartmentNumber = o.DepartmentNumber,
                  StaffNumber = p.StaffNumber

              }).ToList();

        List<Staff_To_Show> searchStaff = new List<Staff_To_Show>();

        searchStaff.AddRange(queryDepar);

        return View(searchStaff);
    }

    [HttpPost]
    public ActionResult StaffPermission(String DepartmentNumber, String StaffNumber, string AesUpd)
    {

        if (string.IsNullOrWhiteSpace(DepartmentNumber))
        {
            ModelState.AddModelError("Department", "error");
            return View();
        }
        else
        {

            string[] password = getTool.Create(AesUpd);

            StaffPermission addstaff = new StaffPermission();

            addstaff.AesUpd = password[0];
            addstaff.AesKey = password[1];
            addstaff.AesIv = password[2];
            addstaff.LastChangePasswordTime = DateTime.Now;
            addstaff.CreateDate = DateTime.Now;
            addstaff.LastUpd = password[0];
            addstaff.LastKey = password[1];
            addstaff.LastIv = password[2];
            addstaff.IsEnabled = true;
            addstaff.StaffNumber = StaffNumber;
            addstaff.DepartmentNumber = Convert.ToInt16(DepartmentNumber);


            dbContext.StaffPermissions.Add(addstaff);
            dbContext.SaveChanges();

            return View();

        }

    }

StaffPermission.cshtml

@using Voyager.Models.Department
@model List<Staff_To_Show>

@{
    ViewBag.Title = "new";
    
}

<h2>new</h2>

<form action="@Url.Action("StaffPermission")" method="post" action="/Home/StaffPermission">

    @Html.AntiForgeryToken()
  
    <div class="form-horizontal">

   <select id="DepartmentNumber" name="DepartmentNumber"class="form-control">
            <option value="">select</option>

              @foreach (var item in Model)
    {
           
        <option value="@item.DepartmentNumber"> @Html.DisplayFor(modelItem => item.DepartmentNumber)</option>

    }
           
        </select>
<br/>
   <select id="DepartmentNumber" name="DepartmentNumber"class="form-control">
            <option value="">select</option>

              @foreach (var item in Model)
    {
           
        <option value="@item.StaffNumber"> @Html.DisplayFor(modelItem => item.StaffNumber)</option>

    }
           
        </select>
        
        <hr />
              <div class="form-group">
            @Html.LabelFor(model => model., htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.StaffPermissions, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.StaffPermissions, "", new { @class = "text-danger" })
            </div>
        </div>

 

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="add" class="btn btn-success" />
            </div>
        </div>
    </div>
  </form>

StaffPermission.cs

using System;
using System.Collections.Generic;

namespace Voyager.Models.Department
{
    public partial class StaffPermission
    {
        public int DepartmentNumber { get; set; }
        public string StaffNumber { get; set; } = null!;
        public string AesUpd { get; set; } = null!;
        public string AesKey { get; set; } = null!;
        public string AesIv { get; set; } = null!;
        public DateTime? CreateDate { get; set; }
        public string? LastUpd { get; set; }
        public string? LastKey { get; set; }
        public string? LastIv { get; set; }
        public DateTime? LastChangePasswordTime { get; set; }
        public bool? IsEnabled { get; set; }
        public virtual staff StaffNumberNavigation { get; set; } = null!;
    }
}

Staff_To_Show.cs

using System;
using System.Collections.Generic;

namespace Voyager.Models.Department
{
    public partial class Staff_To_Show
    {

        public int DepartmentNumber { get; set; }
        public string StaffNumber { get; set; } = null!;
        public IList<StaffPermission> StaffPermissions { get; set; } = null!;

}
}

我建议你使用 ViewModel。

根据您的情况,将 List<Staff_To_Show> 更改为 Staff_To_Show

在Staff_To_Show中,您可以像下面这样更改代码以添加另外两个模型

public class Staff_To_Show
    {
        public List<Department> Departments { get; set; }
         public List<Staff> Staffs { get; set; }
        public StaffPermission StaffPermissions { get; set;}
    }

在StaffPermission.cshtml中:

@using Voyager.Models.Department
    @model Staff_To_Show
    
    @{
        ViewBag.Title = "new";
        
    }
    
    <h2>new</h2>
    
    <form  method="post" action="/Home/StaffPermission">
    
        @Html.AntiForgeryToken()
      
        <div class="form-horizontal">
    
       <select id="DepartmentNumber" name="DepartmentNumber"class="form-control">
                <option value="">select</option>
    
                  @foreach (var item in Model.Departments)
        {
               
            <option value="@item.DepartmentNumber"> @Html.DisplayFor(modelItem => item.DepartmentNumber)</option>
    
        }
               
            </select>
    <br/>
       <select id="DepartmentNumber" name="DepartmentNumber"class="form-control">
                <option value="">select</option>
    
                  @foreach (var item in Model.Staffs)
        {
               
            <option value="@item.StaffNumber"> @Html.DisplayFor(modelItem => item.StaffNumber)</option>
    
        }
               
            </select>
            
            <hr />
                  <div class="form-group">
                @Html.LabelFor(model => model.StaffPermissions, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.EditorFor(model => model.StaffPermissions, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.StaffPermissions, "", new { @class = "text-danger" })
                </div>
            </div>
    
     
    
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="add" class="btn btn-success" />
                </div>
            </div>
        </div>
      </form>