2

我正在尝试弄清楚我是否误解了有关 ASP.NET MVC 的某些内容,或者我是否在 ASP.NET MVC Beta 3 中发现了某种错误。我在使用 HTML Helper 时遇到了 PartialView 拾取错误模型的问题扩展

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

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

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

在这是一个插入的情况下,属性vm.Id以 -1 开始,在调用MapGeneralViewModel.ToModel之后,它已被持久化到数据库中,并且 query.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 助手的值输出是正确的,但是助手输出的值以某种方式获取了传递给控制器​​的视图模型!

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

  • 使用View()而不是PartialView()
  • 将MapGeneralViewModel.FromModel()的结果分配给vm,然后将vm传递给视图
  • 使用<%:<%=
  • vm设置为 null(旧的视图模型仍然被使用)
  • 将传入 id 的值更改为 0(导致在视图中输出 0 而不是 -1)
  • 问题并非特定于名为“Id”的属性,我还测试了具有相同结果的其他字段

我是否对这应该如何工作感到困惑,或者我遇到了 beta 错误?如果它有任何区别,这是在 Win7 64 位机器上的本地 Azure 运行时中运行的。

4

2 回答 2

1

我刚刚在用于按订单显示项目的部分视图中遇到了类似的问题。

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

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

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

我将隐藏的输入直接编码为 html 并且工作正常 - 可能看起来像 MVC3 错误?

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

于 2013-04-12T09:24:13.393 回答
1

MVC 不可能只是拾取一个您没有明确传递给您的视图或在 Session 或 TempData 中徘徊的变量。

由于您将该 Id 设置为 -1,因此我从那里开始解决问题。

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

于 2010-10-22T18:20:39.773 回答