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.EditorFor
在 List<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>
我正在尝试使用 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.EditorFor
在 List<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>