2016-07-05 98 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如何工作。

相關問題