ASP.NET MVC 路由值和视图模型

ASP.NET MVC route values and view model

这是我遇到的一个奇怪问题。

型号:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

观点:

@model Person
<div>
    @Html.TextBoxFor(m => m.FirstName)
</div>
<div>
    @Html.TextBoxFor(m => m.LastName)
</div>

操作:

public ActionResult Contact(string FirstName, string LastName)
{
    // do something with FirstName and LastName passed in

    var person = new Person();
    person.FirstName = "John";
    person.LastName = "Doe";

    return View(person);
}

当通过以下方式调用操作时:

/Home/Contact?FirstName=Jane&LastName=Smith

在视图中,需要 John Doe 的是 Jane Smith。 view model 明明就是人。

但是当视图修改为:

<div>
    @Html.TextBox("First Name", Model.FirstName)
</div>
<div>
    @Html.TextBox("Last Name", Model.LastName)
</div>

一切都很好。这是为什么?我正在使用 MVC 5。

是因为歧义。将函数参数 FirstName 重命名为 _FirstName,将 LastName 重命名为 _LastName。然后它将按您的预期工作。

public ActionResult Contact(string _FirstName, string _LastName)

这就是 HTML 助手的工作方式。他们将首先查看查询参数并使用这些值,而不是使用您在控制器上的模型上指定的值。

有关更多信息,您可以在此处查看相同的 post:Why is my MVC ViewModel member overridden by my ActionResult parameter?

您想改用您的模型吗?在您的控制器上将其删除:

ModelState.Remove("FirstName");
ModelState.Remove("LastName");
var person = new Person();
person.FirstName = "John";
person.LastName = "Doe";

它会呈现您想要的 Model 值。