Model Html帮助程序在给定某个名称时给出错误的值

Model Html帮助程序在给定某个名称时给出错误的值,model,asp.net-mvc-5,html-helper,asp.net-mvc-partialview,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

我的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;}
}
到目前为止还不错,当我在控制器操作中设置断点时,id和MemberId字段设置正确

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

将呈现为:

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

您的操作接受一个参数
id
。这意味着
Request[“id”]
中有一个值,该值将进入
ModelState
ModelState
中的内容优先于在
模型上设置的值。因此,绑定到“id”的文本框将从
请求[“id”]
中获取值

两件事:

  • 对于
  • 帮助程序,最好使用
    *,因为它们允许您以强类型方式绑定到模型属性

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


  • 您的操作接受一个参数
    id
    。这意味着
    Request[“id”]
    中有一个值,该值将进入
    ModelState
    ModelState
    中的内容优先于在
    模型上设置的值。因此,绑定到“id”的文本框将从
    请求[“id”]
    中获取值

    两件事:

  • 对于
  • 帮助程序,最好使用
    *,因为它们允许您以强类型方式绑定到模型属性

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


  • 为同一个字段指定不同的值是什么意思?第一个字段绑定到名为
    id
    的属性,第二个字段绑定到名为
    something
    的属性,但是您用属性
    id
    的值覆盖了它的值(一种糟糕的做法)显示生成的实际html。上面的代码会告诉我:不可能,除非值已添加到
    ModelState
    。您在GET方法中为
    MyViewModel
    添加了一个参数,或者从POST方法返回视图,并且在返回视图之前尝试设置属性值,而不清除
    ModelState
    。显示你的控制器方法。我确实显示了我的控制器方法。问题在于,操作参数id等效于视图模型属性MemberId,并且在设置模型状态时优先于视图模型属性id。将action参数的名称更改为memberId解决了这个问题。我指的是POST方法(如果是这个问题的话)。但是您没有显示相关的代码(这是
    CreateViewModel()
    方法,我假设您正在设置
    model.MemberId=id
    )为同一个字段指定不同的值是什么意思?第一个字段绑定到名为
    id
    的属性,第二个字段绑定到名为
    something
    的属性,但是您用属性
    id
    的值覆盖了它的值(一种糟糕的做法)显示生成的实际html。上面的代码会告诉我:不可能,除非值已添加到
    ModelState
    。您在GET方法中为
    MyViewModel
    添加了一个参数,或者从POST方法返回视图,并且在返回视图之前尝试设置属性值,而不清除
    ModelState
    。显示你的控制器方法。我确实显示了我的控制器方法。问题在于,操作参数id等效于视图模型属性MemberId,并且在设置模型状态时优先于视图模型属性id。将action参数的名称更改为memberId解决了这个问题。我指的是POST方法(如果是这个问题的话)。但是您没有显示相关的代码(这是
    CreateViewModel()
    方法,我假设您正在设置
    model.MemberId=id
    ),谢谢您的回答。是的,我知道数字1,这就是为什么我把“用于测试问题”放在括号里。我试着看看@Html.TextBox提供了什么来尝试隔离这个问题,我得到了我在原始问题中解释的内容。@Html.TextBoxFor(m=>m.id)行正确绑定到id属性,但它是使用memberId值呈现的。至于第2个,在本例中,动作参数“id”相当于视图模型属性“id”。我将动作参数的名称改为MemberId和presto,一切都很好。谢谢你的帮助,谢谢你的回答。是的,我知道数字1,这就是为什么我把“用于测试问题”放在括号里。我试着看看@Html.TextBox提供了什么来尝试隔离这个问题,我得到了我在原始问题中解释的内容。@Html.TextBoxFor(m=>m.id)行正确绑定到id属性,但它是使用memberId值呈现的。对于数字2,动作参数“id”是
    @Html.TextBoxFor(m => m.id)