6

我有一个显示项目列表的 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());
}

为什么会这样?

4

1 回答 1

8

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

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 帮助程序。

于 2012-10-19T09:04:07.177 回答