我有一个非常简单的Controller + View
public ActionResult Edit(string username)
{
return View(ComponentFactory.GetAdapter<IUserListAdapter>().Get(username));
}
和
@model BAP.Models.UserList
@using GrmanIT.Utils.Web
@using BAP.Models
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Globale Benutzer</legend>
<div class="editor-label">
@Html.LabelFor(model => model.UserId)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserId)
@Html.ValidationMessageFor(model => model.UserId)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.UserName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserName)
@Model.UserName
@Html.ValidationMessageFor(model => model.UserName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Bundesland)
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.Bundesland, new SelectList((IEnumerable<BAP.Models.Bundesland>)ViewData["BundeslandList"], "Value", "Text"))
</div>
<div>
<input type="submit" value="@LocalizationHelper.LocalizedLiteral("Save").ToString()" />
</div>
</fieldset>
}
<div>
@Html.ActionLink(LocalizationHelper.LocalizedLiteral("BackToList").ToString(), "Index")
</div>
@Model.UserName
这是迄今为止我们在MVC4应用程序中最简单的控制器和视图,但是它做了一些奇怪的事情: 我得到TextBox,它是用 @ Html.EditorFor(model =&gt; model.UserName)创建的,预先填充了模型的 UserId 而不是 UserName
我调试了它,它和 UserName 和 UserId 中的正确值一样。您还可以看到,我在View中添加了两次 @ Model.UserName 以查看是否也正确呈现了它,是的,它打印的是UserName而不是ID。
我还检查了对 UserName -property的引用,但没有找到任何修改它的内容。我的问题是 - 你有什么想法,代码可以修改的地方,或者如何找到它?
在这一个动作上只发生在这一个控制器上(大约25个控制器和~200个动作)
谢谢
答案 0 :(得分:0)
好的,它是AGAIN的ModelState - 正如你在上面的代码中看到的那样 - 函数的参数叫做“username”,但它实际上是userId。并且由于已经存在参数username,因此它存储在ModelState中并且当我调用
时@Html.EditorFor(model => model.UserName)
它从ModelState获取值(实际上UserId存储在action-parameter的名称下)
所以解决方案是,要么调用ModelState.Clear(),要么重命名参数来表示实际值。