2011-12-21 3 views
1

ここは私のモデルです。モデルにモデルが含まれている場合、デフォルトのモデルバインディングは機能しません

@model MyTestApp.Models.NameModel 

@Html.LabelFor(m => m.LastName) 
@Html.TextBoxFor(m => m.LastName)  
<br /> 
@Html.LabelFor(m => m.FirstName) 
@Html.TextBoxFor(m => m.FirstName)  

を次のように続いてSHOWINFO

@model MyTestApp.Models.InfoModel 

@using (@Html.BeginForm()) 
{ 
    @Html.Partial("ShowName", Model.Name) 
    <br /> 
    @Html.LabelFor(m => m.Phone) 
    @Html.TextBoxFor(m => m.Phone) 
    <br /> 
    <input type="submit" value="Submit Info" /> 
} 

ためのビューがあり

public class InfoModel 
    { 
     public NameModel Name { get; set; } 
     public string Phone { get; set; } 
    } 

public class NameModel 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 

     public NameModel(string first, string last) 
     { 
      this.FirstName = first; 
      this.LastName = last; 
     } 
    } 

その後、私は名前だけを表示するための部分的なビューを持っている今、ユーザーは、コントローラのメソッド以下、すべての情報を提出しています

[HttpPost] 
public ActionResult ShowInfo(InfoModel model) 
{ 
    ... 
} 

問題は、モデルの値を調べるときに、電話は問題ありませんが、名前はnullです。どのようにそれを動作させるためのアイデアですか?

答えて

1

DefaultModelBinderクラスは、Activator.CreateInstance(typeToCreate)を内部的に使用してモデルクラスを作成します。 NameModelクラスにはデフォルトコンストラクタがありませんので、DefaultModelBinderはそれをインスタンス化できません。したがって、デフォルトのコンストラクタを追加すると、それはうまくいくはずです。

EDIT それはあなたの代わりにEditorTemplateを使用する必要がパーシャルビューを動作しません:
は名前EditorTemplatesを使用してビューのフォルダの下にフォルダを作成し、メインビューの使用に追加そこにあなたのShowName.cshtmlを置く:

@using(Html.BeginForm()) 
{ 
    @Html.EditorFor(m => m.Name, "ShowName") 
    ... 
+0

デフォルトのコンストラクタを追加してもこの問題は解決しません –

+0

私は自分の答えを更新しましたが、デフォルトのコンストラクタが必要です:) – nemesv

+0

ここで部分的なビューは使用できません。あなたは詳細を教えていただけますか? –

-1

DefaultModelBinderは、Modelクラスにデフォルトコンストラクタがあり、プロパティが取得および設定されている場合に機能します。他のすべてのケースでは動作しません。

public class Product 
{ 
    public int id; 
    public string name; 
} 

動作しません。

public class Product 
{ 
    public int id {get; set;} 
    public string name {get; set;} 

    public Product() 
    { 
    } 
} 

作品です。

関連する問題