ASP.NET Razor ViewModel属性在某处被修改

时间:2013-06-23 19:02:42

标签: asp.net asp.net-mvc-4 razor asp.net-mvc-viewmodel

我有一个非常简单的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个动作)

谢谢

1 个答案:

答案 0 :(得分:0)

好的,它是AGAIN的ModelState - 正如你在上面的代码中看到的那样 - 函数的参数叫做“username”,但它实际上是userId。并且由于已经存在参数username,因此它存储在ModelState中并且当我调用

@Html.EditorFor(model => model.UserName)

它从ModelState获取值(实际上UserId存储在action-parameter的名称下)

所以解决方案是,要么调用ModelState.Clear(),要么重命名参数来表示实际值。