2012-02-23 44 views
3

我不知道这是否与DropDownListFor扩展或什么错误,但我们有以下几点:ASP.NET MVC 3 - DropDownListFor失败时URL参数也具有相同名称为EXISTS视图模型参数

http://mydomain.com/path/page?myparam=myvalue 

在我的视图模型我有以下几点:

public string MyParam { get; set; } 
public List<SelectListItem> ParamOptions { get; set; } 

当我做了以下在我看来,它没有选择正确的值:

@Html.DropDownListFor(x => x.MyParam, Model.ParamOptions, "Select Value") 

但是,当将我的视图模型中的参数'MyParam'更改为'MyParam2'并更新我的视图以使用MyParam2参数时,它将选择给定MyParam2值的正确选项。在参数名称为MyParam之前不会。

有没有人遇到过这个?这是MVC 3的错误还是这是我的一个不好的实现?

+0

是否显式将模型传递到视图中,如下所示:return View(viewModel)? – swannee 2012-02-23 16:28:06

+0

正确。 '返回视图(“ViewName”,模型);' – Brandon 2012-02-23 16:45:20

+0

这是一个POST? – MikeSW 2012-02-23 16:57:22

回答

1

什么提到的网址,

http://mydomain.com/path/page?myparam=myvalue

的网址有键“myparam”将queryString,因为名字是一样的属性名称和URL时调用它会加入的ModelState值反对“myparam”。

ModelState [“myparam”]将是“myvalue”。

因此,当页面加载的下拉从下拉菜单中选择“myvalue的”下降。

+0

正确,但请求参数不应该自动推送到响应视图。它应该尊重传入的视图模型,除非我不了解某些内容。 – swannee 2012-02-23 17:13:23

+0

不,在视图视图中数据保持最高优先级。由于在获取操作中ModelState已更新为“MyParam”,因此“下拉列表中显示”MyValue“。这与“在表单发布中,如果更新任何属性值并返回相同的视图表单仍将显示旧值”相同。如果您无法更改url查询字符串,请清除模型状态中的值,例如ModelState.Remove(“myparam”) – Manas 2012-02-23 17:22:28

+0

@swannee - 简短回答是,ModelState始终获胜。这不是一个错误,只是一个设计限制。这是众所周知的,它不会改变。这是设计。 – 2012-02-23 17:22:43

0

这不是一个答案,而是说我在一个稍微不同的情况下经历过同样的行为。

在我来说,我打电话从父动作子动作并传递具体到孩子的行动,其中分享了一些与父母的ViewData的相同属性名称的视图模型。当我的子操作部分视图被渲染时,它显示了来自父控制器的viewdata,而不是我传递给子操作的viewmodel中的内容。在这种情况下,看起来像来自父级行为的视图数据污染了我的子级action viewmodel,当这些属性都具有相同的名称时。

所以它看起来像绑定有时候会困惑,什么样的价值,当有名称冲突绑定。在我的例子中,我只是重命名了子视图模型中的属性来防止这种碰撞,但它让我拉我的头发,弄清楚为什么错误的值在那里。

如果有人有一个真正的答案,为什么出现这种情况,我想知道为好。对我来说,它是一个有约束力的bug,但也许这里有一个意图。

1

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

没有什么能为此做些,只需重命名参数或重命名的属性。

+0

重命名模型参数比更新URL参数更容易(由于公共文档)。 – Brandon 2012-02-23 17:40:56

相关问题