给定某个名称时,Html助手会给出错误的值

时间:2015-09-25 11:40:22

标签: model asp.net-mvc-5 html-helper asp.net-mvc-partialview

我的MVC应用程序中发生了一件非常奇怪的事情。我正在渲染部分视图到引导程序弹出窗口。控制器操作如下所示:

[HttpGet]
    public ActionResult GetModalForm(int id)
    {
        var vm = CreateViewModel(id)
        return PartialView("MyPartialView", vm);
    }

这似乎工作正常,视图模型中有两个字段:

 public class MyViewModel
{
    public int id { get; set; }
    public int MemberId {get ; set;}
}

到目前为止,当我在Controller动作中设置断点时,id和MemberId字段设置正确。

现在这里的事情变得古怪,我在局部视图中有以下几行(用于测试问题):

@using ()
{
    @Html.TextBox("id", Model.id)
    @Html.TextBox("something", Model.id)
    <input type='submit'/>
}

当这个渲染时,第一行给我一个值等于MemberId字段的文本框,第二行给我一个等于id字段的值。我真的不明白这两行如何为同一个字段提供不同的值。有什么奇怪的是为什么第二行读取MemberId字段?

之前有没有人见过这样的东西,或者有什么想法可能导致它?我正在接近我的智慧。

提前感谢您的帮助。

更新

为了帮助解释正在发生的事情:如果我的视图模型属性是id = x和MemberId = y。然后是以下一行:

@Html.HiddenFor(m => m.id)

将呈现为:

<input type="hidden" id="id" name="id" value="y"/>

1 个答案:

答案 0 :(得分:4)

您的操作接受参数id。这意味着Request["id"]中有一个值,该值将进入ModelStateModelState中的任何内容优先于Model上设置的值。因此,绑定到“id”的文本框将采用Request["id"]的值。

两件事:

  1. 使用*For助手总是更好,因为它们允许您以强类型方式绑定到模型属性。

    @Html.TextBoxFor(m => m.id)
    
  2. 无论您拥有哪些操作参数,都应在视图模型上具有等效命名的属性,除非它们实际上应该是相同的并保持相同的值。换句话说,如果参数id实际上与MemberId对应,那么您的模型应该没有id属性,或者您应该将动作参数重命名为memberId