2010-10-22 88 views
2

我想解决我是否误解了有关ASP.NET MVC的一些问题,或者是否在ASP.NET MVC Beta 3中发现了某种错误。我遇到了问题用PartialView拿起了错误的模型中使用HTML辅助扩展ASP.NET MVC 3和HTML助手扩展

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

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

    return PartialView("General", MapGeneralViewModel.FromModel(query)); 
} 

在此作为嵌入的情况下,物业vm.Id开始作为-1和在致电MapGeneralViewModel.ToModel它一直持续数据库和查询.Id有一个合适的值。

MapSettingsViewModel.FromModel调用返回一个新视图模型,我已经检查了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) %> 

如果我把一个断点视图,Model.Id正确设置为正确的值。

控制器的实际输出(当Model.Id == 70)看起来是这样的:

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

所以不使用HTML辅助输出值是正确的,但输出的价值观助手不知何故正在拾取传入控制器的视图模型!

我不知道这是怎么发生的。我曾尝试各种事情:

  • 使用视图(),而不是PartialView()
  • 分配MapGeneralViewModel.FromModel()的结果VM,然后通过VM到视图
  • 使用<%:<%=
  • 设置VM为空(旧视图模型某种程度上仍然被使用)
  • 改变传入的id为0的值(结果0被输出在视图中而不是-1)
  • 的问题不是特定于称为“Id”的属性,我也测试了其他字段具有相同的结果

我困惑了这是应该如何工作或我打了一个测试版的bug?如果它有什么区别,它将在Win7 64位机器上的本地Azure运行时内运行。

回答

1

没有办法,MVC只是拿起你没有明确地传递给你的视图或挂在Session或TempData中的变量。

因为你设置的是编号为-1,我开始在那里的问题。

另一种可能性是-1挂在你的ModelState某处周围。该HTML辅助期待的ModelState决定使用您传递任何值前第一。

+0

它似乎来自ModelState。阅读它看起来似乎不得不使用HTML助手来处理模型上的属性,这些属性自从发布到控制器后发生了更改。在这种情况下,这将只是Id属性。那有意义吗 ? – andynormancx 2010-10-22 19:18:04

+0

@andynormancx,是的,模型状态贪婪的HtmlHelpers咬人人似乎。 – jfar 2010-10-22 20:37:26

+0

这似乎是一个非常奇怪的方式来工作。 – andynormancx 2010-10-22 20:52:45

1

我刚才碰到类似的问题,我使用的订单中的显示项的局部视图。

我用下面呈现一个隐藏的输入。

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

,直到我删除了某个项目,使用了错误的(删除)项的ID时也能正常工作。我仔细检查了模型,这是正确的,并在同一视图中的其他用法正确渲染。

我编写了隐藏的输入直接作为HTML,它工作正常 - 看起来像一个MVC3的错误吧?

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