c# – Html.HiddenFor绑定到错误的元素

前端之家收集整理的这篇文章主要介绍了c# – Html.HiddenFor绑定到错误的元素前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个ASP.NET MVC应用程序,显示项目列表.在我的视图页面中,我遍历项目并使用局部视图渲染每个项目,如下所示:
  1. @foreach(var item in Model.items)
  2. {
  3. <li>
  4. @Html.Partial("ItemView",item)
  5. </li>
  6. }

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

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

这些项目正确呈现,生成页面包含所有项目的清单,其中显示了正确的名称和ID.

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

此外,这仅在第二次呈现表单时发生(即,在单击其中一个“删除”按钮后),第一次一切正常.我的动作方法如下所示:

  1. public ActionResult AllItems()
  2. {
  3. var model = new AllItemsModel();
  4. return PartialView(model);
  5. }
  6.  
  7. public ActionResult Delete(DeleteModel model)
  8. {
  9. .... Perform the delete ...
  10. return PartialView("AllItems",new AllItemsModel());
  11. }

为什么会这样?

解决方法

我怀疑这是因为你的RouteData中已经有一个Id参数:
  1. public ActionResult SomeAction(int id)
  2. {
  3. var model = ...
  4. return View(model);
  5. }

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

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

更新:

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

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

您基本上是在这里创建一个新的视图模型并将其传递给局部视图.但HTML帮助程序在绑定时始终使用ModelState中的值.并且只有在您的视图模型中的值之后.因此,如果您打算在POST操作中修改模型的属性,请确保首先从ModelState中删除了此值.在您的示例中,因为您已经完全划破了整个视图模型(通过创建新的AllItemsModel()),您可以清除整个ModelState:

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

此行为是设计使然,适用于所有HTML帮助程序,而不仅适用于HiddenFor帮助程序.

猜你在找的C#相关文章