2016-07-05 4 views
1

私はビューをレンダリングするナンシーサービスを持っています。ビューには、2つのモデル、従業員および人が含まれています。これらのモデルはどちらも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> 

答えて

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; 
    }; 

これは、モデルバインディングとビューエンジンがどのように機能するかを理解するのに役立ちます。

関連する問題