Model Html帮助程序在给定某个名称时给出错误的值
我的MVC应用程序中发生了一件非常奇怪的事情。我正在将部分视图渲染为引导弹出窗口。控制器操作如下所示: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
[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)