【问题标题】:Nancy Binding to Models with same PropertiesNancy 绑定到具有相同属性的模型
【发布时间】:2016-07-15 14:38:04
【问题描述】:

我有一个呈现视图的 Nancy 服务。 View 包含两个模型,Employee 和 Person。这两个模型都有一个名为 Name 的属性。当这些值被回发时,南希似乎采用了第一个 Bind 并将其应用于具有相同名称的两个属性。除了我在下面所做的之外,还有其他方法可以将输入绑定到特定模型吗?

这是模块。

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>

【问题讨论】:

    标签: c# model-binding nancy


    【解决方案1】:

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

    当你这样做时......

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

    ...视图引擎将其翻译为:

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

    这样做是因为您在ReturnModel 构造函数中将PersonModel.Name 设置为“名称”,而@(Model.PersonModel.Name) 只需获取Model.PersonModel.Name 的值。由于您设置了EmployeeModel.Name = "empName",因此其他输入将如下所示:

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

    因此,当您发布表单数据时,有两个输入应该看起来像这样:

    empName = "empName"
    Name = "Name"
    

    当您随后调用 this.Bind&lt;Person&gt;()this.Bind&lt;Employee&gt; 时,Nancy 注意到您在这些类中有一个名为“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;
        };
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多