我的控制器中有一个简单的动作:
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
),因此我得到以下内容:
这是正确的行为吗?在这种情况下,如何更改表单内显示的默认值?
答案 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以便使用元数据进行编辑