Entity Framework Core:如何将实体属性排除在视图外但保留在数据库表中
解决方案
方法1:使用[Display(AutoGenerateField = false)]特性
该特性会告知视图引擎在自动生成表单字段时跳过此属性,同时Entity Framework仍会在数据库中创建对应的列。修改实体类如下:
public class Person { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } [Display(AutoGenerateField = false)] public DateTime DateCreated { get; set; } }
方法2:使用[HiddenInput(DisplayValue = false)]特性
这个特性会把属性渲染为隐藏输入字段,不会显示日期选择器,数据库列也能正常生成。适合需要在表单提交时保留字段值的场景,创建时你只需在后台赋值即可:
public class Person { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } [HiddenInput(DisplayValue = false)] public DateTime DateCreated { get; set; } }
方法3:手动修改创建视图
如果是自动生成的视图,直接删除视图中关于DateCreated的输入控件代码就行。比如删掉类似下面的代码块:
<div class="form-group"> @Html.LabelFor(model => model.DateCreated, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.DateCreated, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.DateCreated, "", new { @class = "text-danger" }) </div> </div>
方法4:使用[ScaffoldColumn(false)]特性(适用于旧版ASP.NET MVC)
作用和Display(AutoGenerateField = false)类似,自动生成视图时会跳过该字段,不影响数据库列的创建:
public class Person { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } [ScaffoldColumn(false)] public DateTime DateCreated { get; set; } }
额外注意事项
在创建实体的后台代码(比如Controller的Create方法)中,记得为DateCreated赋值,同时如果用了Bind特性,不要把DateCreated加入Include列表,避免前端传入值覆盖你设置的日期:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include = "Id,FirstName,LastName")] Person person) { if (ModelState.IsValid) { person.DateCreated = DateTime.Now; // 推荐用DateTime.UtcNow db.People.Add(person); db.SaveChanges(); return RedirectToAction("Index"); } return View(person); }
内容的提问来源于stack exchange,提问作者pnizzle
相关产品推荐
相关产品推荐

