【问题标题】:Html.HiddenFor binding to wrong elementHtml.HiddenFor 绑定到错误的元素
【发布时间】:2012-10-19 08:52:04
【问题描述】:

我有一个显示项目列表的 ASP.NET MVC 应用程序。在我的视图页面中,我遍历项目并使用部分视图呈现每个项目,如下所示:

@foreach(var item in Model.items)
{
   <li>
       @Html.Partial("ItemView", item)
   </li>
}

在项目视图中,我用一个带有“删除”按钮的表单包装每个项目,如下所示:

@using(Html.BeginForm(...))
{
    @Html.HiddenFor(m=>m.Id)
    <label>@Model.Name (@Model.Id)</label>
    <input type="submit" value="Delete"/>
}

项目被正确呈现,结果页面有一个很好的列表,其中包含所有项目的正确名称和 ID。

编辑:@Hidden 显然也是如此,这与我之前写的相反。

此外,这只会在第二次呈现表单时发生(即,在单击一个删除按钮后),第一次一切正常。我的操作方法如下所示:

public ActionResult AllItems()
{
    var model = new AllItemsModel();
    return PartialView(model);
}

public ActionResult Delete(DeleteModel model)
{
    .... Perform the delete ...
    return PartialView("AllItems", new AllItemsModel());
}

为什么会这样?

【问题讨论】:

    标签: c# asp.net-mvc-3 binding


    【解决方案1】:

    我怀疑发生这种情况是因为您的 RouteData 中已经有一个 Id 参数:

    public ActionResult SomeAction(int id)
    {
        var model = ...
        return View(model);
    }
    

    并且您使用/somecontroller/someaction/123 请求了该页面。 HiddenFor 助手现在使用路由值中的 Id 而不是项目的 id。尝试将您的项目视图模型上的属性重命名为不同于 id 的名称。例如ItemId

    另一种可能性是问题仅在回发之后出现,而不是在页面最初呈现时出现。显示您的 POST 操作可能有助于进一步探索这种可能性。


    更新:

    好的,既然你已经展示了你的 POST 动作,事情就更清楚了:

    public ActionResult Delete(DeleteModel model)
    {
        .... Perform the delete ...
        return PartialView("AllItems", new AllItemsModel());
    }
    

    您基本上是在这里创建一个新的视图模型并将其传递给局部视图。但是 HTML 助手在绑定时总是使用来自 ModelState 的值。只有在那之后你的视图模型的价值。因此,如果您打算在 POST 操作中修改模型的属性,请确保首先从 ModelState 中删除了此值。在您的示例中,由于您已经完全划伤了整个视图模型(通过创建 new AllItemsModel()),您可以清除整个 ModelState:

    public ActionResult Delete(DeleteModel model)
    {
        .... Perform the delete ...
    
        // Clear the modelstate otherwise the view will use the values that were initially posted
        // and not the values from your view model
        ModelState.Clear();
        return PartialView("AllItems", new AllItemsModel());
    }
    

    此行为是设计使然,适用于所有 HTML 助手,而不仅仅是 HiddenFor 助手。

    【讨论】:

    • 哇,出色的观察力。我去看看,我想我没有。
    • 您的第一个建议不正确,但您的第二个建议似乎很有希望。太糟糕了,我不能 +1 两次...我会检查一下。
    • 是的,就是这样。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    相关资源
    最近更新 更多