C# ASP.NET MVC 3-当URL参数与视图模型参数同名时,DropDownListFor失败

C# ASP.NET MVC 3-当URL参数与视图模型参数同名时,DropDownListFor失败,c#,asp.net-mvc,asp.net-mvc-3,html.dropdownlistfor,C#,Asp.net Mvc,Asp.net Mvc 3,Html.dropdownlistfor,我不确定这是否是DropDownListFor扩展的错误,但我们有以下问题: http://mydomain.com/path/page?myparam=myvalue public string MyParam { get; set; } public List<SelectListItem> ParamOptions { get; set; } 在我的视图模型中,我有以下内容: http://mydomain.com/path/page?myparam=myvalue pu

我不确定这是否是DropDownListFor扩展的错误,但我们有以下问题:

http://mydomain.com/path/page?myparam=myvalue
public string MyParam { get; set; }
public List<SelectListItem> ParamOptions { get; set; }
在我的视图模型中,我有以下内容:

http://mydomain.com/path/page?myparam=myvalue
public string MyParam { get; set; }
public List<SelectListItem> ParamOptions { get; set; }
但是,当我将视图模型中的参数“MyParam”更改为“MyParam2”并更新视图以使用MyParam2参数时,它将根据MyParam2的值选择正确的选项项。在此之前,当参数名称为MyParam时,它将不会


还有其他人碰到过吗?这是MVC 3的一个错误还是我自己的一个糟糕的实现?

那么上面提到的URL呢

url有一个键为“myparam”的查询字符串,因为该名称与属性名称相同,并且当调用url时,它将针对“myparam”添加一个ModelState值

ModelState[“myparam”]将是“myvalue”


因此,当加载页面时,下拉列表将从下拉列表中选择“myvalue”。

这不是一个很好的答案,只是说我在稍微不同的情况下经历过相同的行为

在我的例子中,我从父操作调用子操作,并传入子操作特定的viewmodel,它与父操作的ViewData共享一些相同的属性名称。呈现子动作部分视图时,它显示的是来自父控制器的viewdata,而不是传递给子动作的viewmodel中的viewdata。在这种情况下,来自父操作的视图数据似乎污染了我的子操作viewmodel,而这两个属性都有相同的名称

因此,当存在名称冲突时,绑定有时会混淆绑定的值。在我的例子中,我刚刚重命名了子viewmodel中的属性以防止这种冲突,但这让我费尽心思找出了错误值的原因


如果有人能真正回答为什么会发生这种情况,我也想知道。对我来说,这是一个绑定错误,但这里可能有一个意图。

这是一个众所周知的问题。这不是一个bug,因为这是设计的。这更多的是设计上的限制


对此无能为力,只需重命名您的参数或重命名属性。

您是否按照:return view(viewModel)的方式将模型显式传递到视图中?正确<代码>返回视图(“视图名称”,模型)否,这是我的获取索引操作。选择的值应该是什么?Model.MyParam?您是否碰巧在控制器中设置了
ViewData[“MyParam”]
ViewBag.MyParam
?如果您向我们展示控制器代码,这会有所帮助。是的,但是请求参数不应该自动推送到响应视图。它应该尊重传入的viewmodel,除非我不理解某些内容。不,在视图中,视图数据具有最高优先级。因为在get action ModelState中更新了“MyParam”,所以在下拉列表中显示“MyValue”。这与“在表单帖子中,如果更新任何属性值并返回相同的视图,表单仍将显示旧值”的原因相同。如果无法更改url查询字符串,请清除模型状态中的值,如ModelState.Remove(“myparam”)@swannee-简而言之,ModelState始终获胜。这不是一个bug,只是一个设计限制。这是众所周知的,而且不会改变。这是经过设计的。重命名模型参数比更新URL参数更容易(由于公共文档)。