ASP.Net编辑丢失值

时间:2017-09-26 13:34:35

标签: c# asp.net asp.net-mvc

举个例子,我正在为以下模型创建一个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会在它发送的对象上被清除,因为我没有在视图中包含它们。我的编辑表单是否需要为每个未使用的列隐藏字段,或者是否有更好的方法来继承这些值?

1 个答案:

答案 0 :(得分:0)

  

我的编辑表单是否需要每个未使用列的隐藏字段

不,但它需要任何使用值的字段。这将包括在将模型发送回服务器时需要包含在模型中的任何值。 (当然值得注意的是,用户可以修改发送到服务器的任何值,并且出于任何安全或授权目的,不应隐式信任用户输入。 )

基本上你有两个选择:

  1. 在表格POST中包含重新构建对象所需的任何值。
  2. 在POST表单中包含一个标识符以引用您的对象,并使用该标识符从数据中获取对象并从中重新构造它。
  3. 后一种方法可能确实适合您,因为您已经在表单中包含了标识符:

    @Html.HiddenFor(model => model.ID)
    

    您可以使用它从数据库中获取实际的模型实例,然后使用您收到的表单数据子集来更改 模型实例的相关值。