2016-07-05 49 views
1

我有一个呈现视图的Nancy服务。该视图包含两个模型,员工和人员。这两个模型都有一个名为Name的属性。当这些值得到发布后,似乎南希采取第一个绑定<>并将其应用于两个具有相同名称的属性。有没有办法将输入绑定到特定的模型,而不是我在下面做的?Nancy绑定到具有相同属性的模型

这是模块。

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> 

回答

2

南希的ModelBinding的工作原理是将HTML输入的“name'属性结合在给定模型中的属性的名称。

当你这样做......

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

... ViewEngine可以将它转换为这样的:

<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<Person>()this.Bind<Employee>,Nancy注意到在这些类中有一个名为“Name”的属性,因此试图在表单数据中找到名为“Name”的输入(它对每个公有属性都这样做)。由于您的表单数据中确实存在“姓名”字段,南希将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; 
    }; 

我希望这有助于理解模型绑定和viewengine如何工作。

相关问题