2011-12-22 8 views
1

私は昨日尋ねたその類似の質問hereを少し修正しました。ここでさらに別のモデルバインディングの問題

は、上記のビューは以下のようにShowInfo.cshtmlに使用されている

@model MyTestApp.Models.NameModel 

@Html.DropDownListFor(m => m.Title, Model.Titles, Model.Titles) 
<br /> 
@Html.LabelFor(m => m.LastName) 
@Html.TextBoxFor(m => m.LastName)  
<br /> 
@Html.LabelFor(m => m.FirstName) 
@Html.TextBoxFor(m => m.FirstName)  

を次のように私は私の最初のビューShowName.cshtmlを持って

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

public class NameModel 
{ 
    public string Title  { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public List<SelectListItem> Titles 
    { 
     get 
     { 
      var list = new List<SelectListItem>(); 
      list.Add(new SelectListItem() { Text = "Mr.", Value = "Mr." }); 
      list.Add(new SelectListItem() { Text = "Mrs.", Value = "Mrs." }); 
      list.Add(new SelectListItem() { Text = "Ms.", Value = "Ms." }); 

      return list; 
     } 
    } 

    public NameModel() 
    { 

    } 

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

その後、私のモデルです

@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" /> 
} 

ユーザが何らかの情報を提出する場合、コントローラのメソッドは、

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

問題は、電話機は問題ありませんが、名前はヌルです。 @Html.Partial("ShowName", Model.Name)の電話番号を@Html.EditorFor(m => m.Name, "ShowName") に変更すると、タイトルのドロップダウンが編集ボックスとして表示されます

答えて

2

エディタテンプレートを使用することをお勧めします。だからではなくHtml.Partial使用:

@Html.EditorFor(x => x.Name, "ShowName") 

、その後~/Views/Shared/EditorTemplates/ShowName.cshtmlに部分的に移動します。

部分的に機能しない理由は、入力フィールドに間違った名前が生成されるためです。あなたが必要とするのに対し、

<input type="text" name="LastName" id="LastName" value="" /> 

:正常に動作とのLastNameのプロパティを割り当てるデフォルトのモデルバインダー用

<input type="text" name="Name.LastName" id="Name_LastName" value="" /> 

をあなたが書くとき:

@Html.TextBoxFor(m => m.LastName) 

これは、次のマークアップを生成し、メインビューモデルのNameプロパティ。

私の例に示すように、エディタテンプレートを使用すると、自動的に関連付けパスが処理され、入力要素の適切な名前が生成されます。

+0

私の質問で述べたように、エディタテンプレートを使用する際の問題は、リストタイトルをドロップダウンリストとして表示しないということです。私はそれで何をすると思いますか? –

+0

@palmsnow、なぜそれが正しく表示されていないのですか?代わりにそれは何を表示しますか?また、間違った過負荷を使用しているようです。 '@Html.DropDownListFor(m => m.Title、Model.Titles)'を使うべきです。これは正常に動作するはずです。 –

+0

私は他の過負荷でも試しました。ドロップダウンは編集ボックスとして表示されます。そのコレクションや何かが原因かもしれませんか? –