路由param并查看具有相同名称的模型属性 - 意外行为

时间:2015-07-15 12:56:19

标签: c# asp.net-mvc model-binding

不确定这是不是错误,或者我错过了什么。

当我有一个路由参数“bar”并且在我的视图模型中具有相同名称“Bar”的属性时,MVC会混淆并在html帮助器中显示意外结果。让我们看一下。

(代码是自由输入的,所以它可能无法正常工作,但我希望它足以得到我刚才偶然发现的内容)

让我们从以下控制器开始:

public class MyController : Controller {
  ...
  [Route("my/route/{bar}")]
  public ActionResult Foo(string bar) {
    ...
    var viewModel = new MyViewModel() { Bar = "baz"; }

    return this.View(viewModel);
  }
  ...    
}

我们将以下视图模型传递给视图:

public class MyViewModel {
  ...
  public string Bar { get; set; }
  ...
}

在视图中,他们会有这样的事情:

...
@Html.LabelFor(l => l.Bar)
@Html.EditorFor(m => m.Bar)
...

当我们召集这样的行动时:

@Html.ActionLink("Link", "Foo", "MyController", new { bar = "mystring" })

EditorFor中的预期结果为"baz",但不是的情况。实际上它是"mystring"。即使@Model.Bar会打印预期结果"baz"

这是期望的行为还是(已知的)错误?如果没有,我在哪里报告这个?

祝你好运

1 个答案:

答案 0 :(得分:1)

这不是每个设计的错误,也就是模型绑定器在MVC中的工作方式:

  

这是设计的 - ModelState是最高优先级的值提供者   对于模型属性,高于偶数模型本身。没有查询   string参数,ModelState不包含MyProperty的值,所以   框架使用模型值。

请参阅此questionanswer