0

我有一个非常简单的 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 => model.UserName)预填充的UserId创建的模型而不是用户名

我对其进行了调试,并且一如既往地在UserNameUserId中有正确的值。您还可以看到,我在 View 中添加了两次@Model.UserName以查看它是否也正确呈现,是的,它打印的是 UserName 而不是 ID。

我还检查了对UserName -property 的引用,但没有找到任何可以修改它的引用。我的问题是 - 你有什么想法,代码可以在哪里修改或者如何找到它?

它只发生在这一个控制器上的这一操作上(约 25 个控制器和约 200 个操作)

谢谢

4

1 回答 1

0

好的,它又是 ModelState - 正如您在上面的代码中看到的那样 - 函数的参数称为“用户名”,但它实际上是 userId。而且由于已经有参数用户名,它存储在ModelState中,当我调用时

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

它从 ModelState 中获取值(实际上 UserId 存储在操作参数的名称下)

所以解决方案是调用 ModelState.Clear() 或者更确切地说,重命名参数以表示实际值。

于 2013-06-24T15:53:33.267 回答