代码之家  ›  专栏  ›  技术社区  ›  andynormancx

ASP.NET MVC 3和HTML助手扩展

  •  2
  • andynormancx  · 技术社区  · 14 年前

    我试图弄清楚我是否误解了关于ASP.NET MVC的一些事情,或者我是否在ASP.NET MVC Beta 3中发现了某种bug。当使用HTML帮助程序扩展时,我遇到了一个部分视图选择错误模型的问题。

    我的控制器代码如下:

    public ActionResult EditGeneral(MapGeneralViewModel vm)
    {
        var query = MapGeneralViewModel.ToModel(vm, svcMaps);
    
        return PartialView("General", MapGeneralViewModel.FromModel(query));
    }
    

    如果这是插入,则属性 虚拟机ID 从-1开始,在呼叫到 地图常规视图模型.tomodel 已将数据库和查询持久化。ID的值正确。

    呼叫 地图设置视图Model.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 正确设置为正确的值。

    控制器的实际输出(当 型号.id ==70)如下:

        70
        <input id="IdTest" name="IdTest" type="hidden" value="-1" />
        <input id="Id" name="Id" type="hidden" value="-1" />
    

    因此,不使用HTML帮助器的值输出是正确的,但是帮助器输出的值不知何故会获取传递给控制器的视图模型!

    我不知道这是怎么回事。我尝试过各种方法:

    • 使用 视图() 而不是 部分视图()
    • 分配的结果 MapGeneralViewModel.FromModel()。 虚拟机 然后路过 虚拟机 到视图
    • 使用 <%: <%=
    • 设置 虚拟机 为空(以某种方式仍然使用旧的视图模型)
    • 将传入ID的值更改为0(导致在视图中输出0而不是-1)
    • 这个问题并不特定于名为“id”的属性,我还用相同的结果测试了其他字段。

    我是不是对这个应该如何工作感到困惑,还是我碰到了一个测试版的bug?如果有什么不同,这是在我的本地Azure运行时的Win7 64位计算机上运行的。

    2 回复  |  直到 12 年前
        1
  •  1
  •   Rap    13 年前

    MVC不可能只获取一个尚未显式传递给视图或在会话或tempdata中挂起的变量。

    既然你把身份证设为-1,我就开始找麻烦了。

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

        2
  •  1
  •   Mike Dennison    12 年前

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

    我正在使用下面的内容呈现隐藏的输入。

    @Html.Hidden("salesorderlineid", orderLine.SalesOrderLineID)

    如果使用了错误(已删除)项的ID,则在删除该项之前,此项工作正常。我仔细检查了模型,这是正确的,在同一视图的其他用途中呈现正确。

    我将隐藏的输入直接编码为HTML,它工作得很好——可能看起来像MVC3 bug?

    <input type="hidden" name="salesorderlineid" value="@orderLine.SalesOrderLineID"/>