1

次のシナリオを処理する一般的に受け入れられている方法はありますか、それとも設計が不十分ですか?

私はいくつかのドメインモデルを持っています:

            public class Person
            {
                public int ID {get;set;}
                public string Name{get;set;}
                public int? AddressID {get;set;}
            }
            public class Address
            {
                public int ID{get;set;}
                public string Street {get;set;}
            }

次に、ビューモデルを次のように作成します。

            public class Personnel
            {
                public Person Person{get;set;}
                public Address Address{get;set;}
            }

それで、私は Personnel モデルに強く型付けされたビューを持っていて、このようなものがあると言います

            @Html.HiddenFor(m => m.Address.ID)
            @Html.EditorFor(m => m.Address.Street)

問題は、Personnel モデルを取得すると、Person に住所がない場合があるため、Address が null になる場合があることです。ただし、UI では、入力テキスト ボックスが引き続き表示される必要があります。Address が null の場合、ビューからの結果のマークアップは次のようになります。

            <input value name="Address.AddressID" type="hidden">

私はそのようなコントローラーを持っています

    [HttpPost]
    public ActionResult EditPersonnel(Personnel model)
    {
        if (ModelState.IsValid)
        {
            model.Save() // or whatever
        }

        return View(model);

    }

そのため、コントローラーにポストバックすると、Address.ID のフォーム コレクションの値に空の文字列が含まれます。バインダーは空の文字列を int に変換できないため、ModelState は常に無効です。しかし、実際にはアドレスがないため(ユーザーが情報を入力しなかったとしましょう)、とにかくバインドしたくありませんでした。バインダーに Address フィールドを無視させるにはどうすればよいですか?

4

2 に答える 2

1

現実的には、ビューがモデル プロパティを必要とする場合、Addressプロパティは決してそうであってはなりません。がnullの場合、の「空の」インスタンスをプロパティに割り当てます。Person.AddressIDnullAddressPersonnel.Address

// assuming you have a data object named "person"
if(!person.AddressID.HasValue) // or use person.AddressID == null
{
     model.Address = new Address(); // assuming your view model is called "model"
}
于 2013-06-08T03:39:23.780 に答える
0

試す

        [HttpPost]
        public ActionResult EditPersonnel(Personnel model)
        {
            if(model.Address.Equals(null))
              model.Address = new Address();
            if (ModelState.IsValid)
            {
                model.Save() // or whatever
            }

            return View(model);

        }
于 2013-06-08T03:39:18.907 に答える