Asp.net mvc ASP.NET MVC 3和HTML帮助程序扩展

Asp.net mvc ASP.NET MVC 3和HTML帮助程序扩展,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我试图弄清楚我是否误解了ASP.NETMVC,或者我是否在ASP.NETMVC Beta3中发现了某种缺陷。在使用HTML帮助程序扩展时,我遇到了PartialView选择错误模型的问题 我的控制器代码如下所示: public ActionResult EditGeneral(MapGeneralViewModel vm) { var query = MapGeneralViewModel.ToModel(vm, svcMaps); return PartialView("Ge

我试图弄清楚我是否误解了ASP.NETMVC,或者我是否在ASP.NETMVC Beta3中发现了某种缺陷。在使用HTML帮助程序扩展时,我遇到了PartialView选择错误模型的问题

我的控制器代码如下所示:

public ActionResult EditGeneral(MapGeneralViewModel vm)
{
    var query = MapGeneralViewModel.ToModel(vm, svcMaps);

    return PartialView("General", MapGeneralViewModel.FromModel(query));
}
    70
    <input id="IdTest" name="IdTest" type="hidden" value="-1" />
    <input id="Id" name="Id" type="hidden" value="-1" />
如果这是一个insert,则属性vm.Id以-1开头,在调用MapGeneralViewModel.ToModel之后,它已被持久化到数据库和查询中。Id具有正确的值

调用MapSettingsViewModel.FromModel将返回一个新的viewmodel,我已检查Id属性是否包含新创建的Id值

视图的相关部分如下所示:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<AdminWebRole.Models.Map.MapGeneralViewModel>" %>
            <%: Model.Id %>
            <%= Html.Hidden("IdTest", Model.Id) %>
            <%= Html.HiddenFor(model => model.Id) %>

型号(Id)%>
如果在视图中放置断点,Model.Id被正确设置为正确的值

控制器的实际输出(当Model.Id==70时)如下所示:

public ActionResult EditGeneral(MapGeneralViewModel vm)
{
    var query = MapGeneralViewModel.ToModel(vm, svcMaps);

    return PartialView("General", MapGeneralViewModel.FromModel(query));
}
    70
    <input id="IdTest" name="IdTest" type="hidden" value="-1" />
    <input id="Id" name="Id" type="hidden" value="-1" />
70
因此,不使用HTML帮助程序的值输出是正确的,但是帮助程序输出的值以某种方式拾取了传递到控制器中的viewmodel

我不知道这是怎么发生的。我尝试过各种方法:

  • 使用View()而不是PartialView()
  • MapGeneralViewModel.FromModel()的结果分配给vm,然后将vm传递给视图

  • 使用MVC不可能只是拾取一个未显式传递到视图或在会话或临时数据中挂起的变量

    既然你把Id设置为-1,我就从那里开始找问题


    另一种可能是-1在您的ModelState的某个地方徘徊。HTML助手在决定使用您传入的任何值之前,首先查看ModelState。

    我刚刚在用于按顺序显示项目的局部视图中遇到了类似的问题

    我正在使用以下命令渲染隐藏的输入

    @Html.Hidden(“salesorderlineid”,orderLine.salesorderlineid)

    在使用错误(已删除)项目的ID删除某个项目之前,此操作一直正常。我仔细检查了模型,这是正确的,并且在同一视图上的其他用法中呈现正确

    我将隐藏的输入直接编码为html,效果很好——看起来像MVC3 bug


    它似乎确实来自ModelState。环顾四周,我似乎不必为模型上的属性使用HTML帮助程序,这些属性自发布到控制器后发生了更改。在这种情况下,这将只是Id属性。这有意义吗?@andynormancx,是的,贪婪的ModelState-HtmlHelpers似乎会咬每个人。如果这是故意的,那真的很令人沮丧!你知道发生了什么吗?或者我们真的应该去db两次才能得到自动生成的id,或者直接查询modelstate,如果我们不想这样做的话?只是为了添加我记得我的id字段在mvc中没有被更新,我不得不再次访问以获取它,所以遇到了与您相同的问题。我不必来回访问数据库,我只需使用自己的代码从我的模型中发出id字段,因为它从数据库返回。我怀疑我仍然不理解您应该如何充分使用模型绑定和模型状态,需要坐下来,在某个时候深入了解它。