绑定到具有相同属性的模型

本文关键字:属性 模型 绑定 | 更新日期: 2023-09-27 17:54:38

我有一个渲染视图的Nancy Service。视图包含两个模型,Employee和Person。这两个模型都有一个名为Name的属性。当这些值被返回时,Nancy似乎使用第一个Bind<>并将其应用于具有相同名称的两个属性。除了我下面所做的之外,是否还有其他方法可以将Input绑定到特定的模型?

这是模块。

public class IndexModule : NancyModule
{
    public IndexModule()
        : base("/")
    {
        Get["/"] = parameters =>
        {
            var returnModel = new ReturnModel();
            return View["index.cshtml", returnModel];
        };
        Post["/"] = parameters =>
        {
            var person = this.Bind<Person>();      //Name="Name"
            var employee = this.Bind<Employee>();  //Name="Name", should be "empName"
            return 200;
        };
    }
}
public class ReturnModel
{
    public Person PersonModel;
    public Employee EmployeeModel;
    public ReturnModel()
    {
        PersonModel = new Person();
        EmployeeModel = new Employee();
        PersonModel.Name = "Name";
        EmployeeModel.Name = "empName";
    }
}

HTML视图
@inherits Nancy.ViewEngines.Razor.NancyRazorViewBase<NancyTestSite.Modules.ReturnModel>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8" />
</head>
<body>
<form method="POST">
    <input name="@(Model.EmployeeModel.Name)" type="text" value="@(Model.EmployeeModel.Name)">
    <input name="@(Model.PersonModel.Name)" type="text" value="@(Model.PersonModel.Name)">
    <button type="submit">Submit</button>
</form>

绑定到具有相同属性的模型

Nancy的ModelBinding通过将html输入的'name'属性绑定到给定模型中的属性名来工作。

当你这样做的时候…

<input name="@(Model.PersonModel.Name)" type="text" value="@(Model.PersonModel.Name)">

…视图引擎将其翻译为:

<input name="Name" type="text" value="Name">

这样做是因为您在ReturnModel构造器中将PersonModel.Name设置为"Name",而@(Model.PersonModel.Name)只是获得Model.PersonModel.Name的值。因为您设置了EmployeeModel.Name = "empName",所以其他输入看起来像这样:

<input name="empName" type="text" value="empName">

所以当你发布你的表单数据时,有两个输入应该看起来像这样:

empName = "empName"
Name = "Name"

当你调用this.Bind<Person>()this.Bind<Employee>时,Nancy注意到你在这些类中有一个名为"Name"的属性,因此试图在form-data中找到一个名为"Name"的输入(它对每个公共属性都这样做)。由于表单数据中确实有一个"Name"字段,Nancy将Name属性设置为给定的值,从而使您的个人和员工的Name属性都设置为"Name"

据我所知,不可能将输入绑定到特定模型(默认情况下)。但是你可以简单地这样做:

<input name="EmployeeName" type="text" value="@(Model.EmployeeModel.Name)">
<input name="PersonName" type="text" value="@(Model.PersonModel.Name)">

发送到服务器的表单数据包含如下内容:

EmployeeName = "empName"
PersonName = "Name"

最后,在你的控制器中,你这样做:

Post["/"] = parameters =>
    {
        var person = new Person();
        person.Name = this.Request.Form["PersonName"];
        var employee = new Employee();
        employee.Name = this.Request.Form["EmployeeName"];
        return 200;
    };

我希望这有助于理解模型绑定和视图引擎是如何工作的。