私は次のアドレスViewModelを持っています:
public class AddressViewModel
{
[StringLength(20, MinimumLength = 2, ErrorMessage = "Country name is too short")]
public String Country { get; set; }
public String City { get; set; }
public String Street { get; set; }
public String Number { get; set; }
public String ApartmentBuilding { get; set; }
public String Sector { get; set; }
}
そしてそれをレンダリングするビュー:
<div class="control-group offset2 span6">
@Html.LabelFor(m => m.Country)
<div class="controls">
@{
var countryCtrlName = Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName("Country");
Html.RenderAction("List", "Country", new { ControlName = countryCtrlName });
}
@Html.ValidationMessageFor(m => m.Country)
</div>
</div>
Html.RenderAction( "List")は、データベースからすべての国を取得し、ドロップダウンを使用してパーシャルをレンダリングおよびレンダリングするコントローラーメソッドを呼び出します。ビューは次のとおりです。
@model IEnumerable<SelectListItem>
@{var controlName = (string)ViewBag.ControlName;}
@Html.DropDownList(controlName, Model, new {@class = ViewBag.CssClass})
DropdownListコントロールが正しい名前でレンダリングされ、POST時に正しいViewModelにマップされても、入力コントロールは、クライアント側の検証を有効にするために必要なdata-val属性で装飾されていません(これは、パーシャルは、国名を保持するstringプロパティではなく、IEnumerableです。
アドレスビューモデルは、私のアプリケーションを通じて、多くのビューのネストされたプロパティとして使用されます。それを検証する方法について何かアイデアはありますか?
編集:@Robertの回答に基づいてViewModelを更新しました:
public class AddressViewModel {[StringLength(20、MinimumLength = 2、ErrorMessage = "国名が短すぎます")] public String Country {get; セットする; }
public String City { get; set; }
public String Street { get; set; }
public String Number { get; set; }
public String ApartmentBuilding { get; set; }
public String Sector { get; set; }
public IEnumerable<CountryViewModel> CountryList {get; set;}
//Constructor to pass the list of countries
public AddressViewModel(IEnumerable<CountryViewModel> countries)
{
this.CountryList = countries;
}
}