举个例子,我正在为以下模型创建一个ASP.Net MVC控制器:
public class MyItem
{
public int ID { get; set; }
public int ItemTypeID { get; set; }
public string Description { get; set; }
public DateTime CreateDate { get; set; }
public DateTime? ModifyDate { get; set; }
}
对于此示例,Description是用户能够查看或修改的唯一字段。
首次创建记录时设置ItemTypeID和CreateDate。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(
Include = "ID,ItemTypeID,Description,CreateDate,ModifyDate")] MyItem myItem)
{
if (ModelState.IsValid)
{
// Set values for behind-the-scenes columns.
myItem.ItemTypeID = 1;
myItem.CreateDate = DateTime.Now;
db.MyItems.Add(myItem);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(myItem);
}
我的编辑视图只有一个描述控件,因为这是我在表单上唯一需要的。
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>MyItem</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.ID)
<div class="form-group">
@Html.LabelFor(model => model.Description,
htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Description,
new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Description, "",
new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
}
我的HttPost编辑功能设置ModifyDate。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(
Include = "ID,ItemTypeID,Description,CreateDate,ModifyDate")] MyItem myItem)
{
if (ModelState.IsValid)
{
// Set modified date.
myItem.ModifyDate = DateTime.Now;
db.Entry(myItem).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(myItem);
}
我的问题是当它执行HttpPost Edit时,ItemTypeID和CreateDate会在它发送的对象上被清除,因为我没有在视图中包含它们。我的编辑表单是否需要为每个未使用的列隐藏字段,或者是否有更好的方法来继承这些值?
答案 0 :(得分:0)
我的编辑表单是否需要每个未使用列的隐藏字段
不,但它需要任何使用值的字段。这将包括在将模型发送回服务器时需要包含在模型中的任何值。 (当然值得注意的是,用户可以修改发送到服务器的任何值,并且出于任何安全或授权目的,不应隐式信任用户输入。 )
基本上你有两个选择:
后一种方法可能确实适合您,因为您已经在表单中包含了标识符:
@Html.HiddenFor(model => model.ID)
您可以使用它从数据库中获取实际的模型实例,然后使用您收到的表单数据子集来更改 模型实例的相关值。