ASP.Net MVC3中模型字段的默认值

时间:2011-09-01 11:11:01

标签: c# asp.net-mvc

我的控制器中有一个简单的动作:

    public ActionResult Edit(int itemId)
    {
        return View(new EditModel() { ItemId = itemId + 1 });
    }

    public class EditModel
    {
        public int ItemId { get; set; }
        public string Title { get; set; }
    }

当我尝试显示所有内容时,问题出现在View中。

Model.ItemId: @Model.ItemId
@Html.EditorForModel()

由于EditModel上的action参数和属性具有相同的名称(itemId),因此我得到以下内容:

enter image description here

这是正确的行为吗?在这种情况下,如何更改表单内显示的默认值?

2 个答案:

答案 0 :(得分:2)

对于第一次看,这可能会有些混乱,但是,这是默认(正确)行为。当您使用EditorFor或类似的编辑助手时,Controller.ModelState是值的特权供应商,而不是模型本身。但是你的情况更棘手。

使用参与模型绑定的操作参数和值填充ModelState。当您调用该操作时,ModelState会填充"ItemId" = action parameter(itemId) value。稍后,EditorFor会看到应该为ItemId绘制编辑器。由于ModelState已经有ItemId,因此它不会查看模型值,而是从ModelState["ItemId"]中提取它。错误的棘手来源是操作参数名称与模型属性名称匹配,而modelState优先于模型值。最好的解决方案(干净的解决方案)就是重命名动作参数,使其与模型属性名称不匹配。

public ActionResult Edit(int initialItemId)
        {
            return View(new EditModel() { itemId = initialItemId + 1 });
        }

这样就可以了。

答案 1 :(得分:0)

你可以写

Model.ItemId: @Model.ItemId
@Html.EditorFor(x => x.Title)

或隐藏ItemId以便使用元数据进行编辑