0

従業員と個人の 2 つのモデルがあります。

public class Employee
{ 
    [Key]
    public int Id { get; set; }
    public int? PersonId { get; set; }

    [ForeignKey("PersonId")]
    public virtual Person Person { get; set; }

}

public class Person
{ 
    public IList<PhoneNumber> PhoneNumbers { get; set; }
    public int Id { get; set; }
    public string FName { get; set; }
    public string LName { get; set; }
    public Person()
    {
        PhoneNumbers = new List<PhoneNumber>
                            {
                                new PhoneNumber()
                            };      
    }
}

電話用のエディタ テンプレート:

         @Html.TextBoxFor(x => x.Number)
         @Html.DropDownListFor(m => m, new SelectList(Enum.GetNames(typeof (WebMVC.Core.Common.PhoneType))))

混乱を避けるために、他の (関係のない) プロパティを削除しました。

私が抱えている問題は、Employee Create() にいる間、個人の FName と LName をバインドできますが、PhoneNumbers コレクションをバインドできないことです。

2008 年の Haack ブログについては知っていますが、この状況を反映しているとは思いません。

従業員の Create() で個人の電話番号コレクションをバインドするソリューションを知っている人はいますか?

4

2 に答える 2

2

PhoneNumber があなたが作成したカスタム クラスなのか、それともフレームワークに組み込まれたものなのか、正確にはわかりません。ただし、投稿されたデータを指定したように Employee クラスにマッピングする MVC3 に問題がある場合は、カスタム バインディングの作成を検討することをお勧めします。エディター テンプレートのコードが正しくない場合、これは実際には問題にならないことに注意してください。そのため、最初にフィドラーを使用して確認します。

ここにいくつかの良いサイトがあります. http://odetocode.com/blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspx http://odetocode.com/blogs/scott/archive /2009/05/05/iterating-on-an-asp-net-mvc-model-binder.aspx http://www.singingeels.com/Articles/Model_Binders_in_ASPNET_MVC.aspx

カスタム バインダーを作成すると、MVC が投稿されたモデル データを解析し、オブジェクトに入力する方法を完全に制御できます。ほとんどの人がオーバーライドする 2 つの主な機能がありCreateModelますBindModelBindModelこれがあなたが行きたい方法である場合、オーバーライドしたいと思う可能性が最も高い関数です。

于 2012-06-03T15:43:27.150 に答える
1

エディター テンプレートの html がどのように見えるかはわかりませんが、カスタム タイプのコレクションにバインドするには、次のようにする必要があります。

<input name="[0].Number">
<input name="[0].PhoneType">
<input name="[1].Number">
<input name="[1].PhoneType">
<input name="[2].Number">
<input name="[2].PhoneType">
于 2012-06-03T15:28:08.253 に答える