我想解决我是否误解了有关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运行时内运行。
它似乎来自ModelState。阅读它看起来似乎不得不使用HTML助手来处理模型上的属性,这些属性自从发布到控制器后发生了更改。在这种情况下,这将只是Id属性。那有意义吗 ? – andynormancx 2010-10-22 19:18:04
@andynormancx,是的,模型状态贪婪的HtmlHelpers咬人人似乎。 – jfar 2010-10-22 20:37:26
这似乎是一个非常奇怪的方式来工作。 – andynormancx 2010-10-22 20:52:45