1

次のドメイン エンティティを使用して asp.net アプリケーションを作成しました。

public class Person
{
  [Required]
  public string name { get; set; }
  public string address { get; set; }
  public ICollection<Item> ItemsPurchased { get; set;}
}

public class Item
{
  [Required]
  public string name { get; set; }
  public int price { get; set; }
}

ビューモデル付き

public class PersonViewModel
{
  public Person Entity { get; set; }
  public Item ItemPurchased { get; set; }
}

これで、購入したアイテム(ある場合)とともに個人の詳細を入力するように求めるフォームができました

Html.Label("Person Name")
Html.TextboxFor(model => model.Entity.name)
Html.ValidationMessageFor(model => model.Entity.name)


Html.Label("Item Name")
Html.TextboxFor(model => model.ItemPurchased.name)
Html.ValidationMessageFor(model => model.ItemPurchased.name)


Html.Label("Item Price")
Html.TextboxFor(model => model.ItemPurchased.Price)
Html.ValidationMessageFor(model => model.ItemPurchased.Price)

そして最後に、コントローラーでアイテムを (ユーザーが指定した場合) コレクションに追加します。

if(!this.ModelState.IsValid)
{
  //Return the view with validation errors
}

主な問題

アイテム名の値を指定しないと、「名前フィールドが必要です」という検証エラーが表示されます。しかし、このフォームのみの項目オブジェクト属性の検証を削除したいと考えています。どうやってやるの?

4

1 に答える 1

3

ビューモデルを使用する必要があります。ビュー モデルは、ビューの要件を満たすように特別に設計されたクラスです。このビューでは、名前が不要であるという要件があるようです。したがって、ビュー モデルを設計します。

public class EditItemViewModel
{
    public string name { get; set; }
    public int price { get; set; }
}

と:

public class EditPersonViewModel
{
    public Person Entity { get; set; }
    public EditItemViewModel ItemPurchased { get; set; }
}

そして、あなたは行ってもいいです。このnameフォームでは は不要になります。

AutoMapperまた、ドメイン モデルとビュー モデルの間のマッピングを大幅に簡素化できるものを確認することをお勧めします。

于 2013-03-18T08:11:59.970 に答える