0

私は次のアドレス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;
}

}

4

2 に答える 2

1

CountryModel を作成してみて、ドロップダウン リストを処理する別のコントローラーを用意しましたか。コントローラーに、必要なページに配置できる部分ビューを返すようにします。IEnumerable を持つ CountryModel に 1 つのプロパティがありますか?

アドレス ビュー:

@model AddressModel

@Html.Partial("nameOfPartialView", CountryModel)

モデル:

public class CountryModel
{
    public IEnumerable<Countries> Countries { get; set; }
}

コントローラ:

public ActionResult Countries()
{
    var countries = //get the list from the database
    return PartialView(countries);
}

国の DropDownList を含む部分ビュー:

@model CountryModel
@{var controlName = (string)ViewBag.ControlName;}
@Html.DropDownListFor(Model => Model.Countries)

国を受け入れるコントローラー:

public ActionResult GetCountry(int CountryId)
{
     //do something with the selected country
}
于 2013-03-06T21:10:06.010 に答える
0

問題が何であるかについては正しいと思います。注釈付きモデルを部分ビューに渡すのではなく、のを渡しIEnumerableますSelectListItem。フレームワークは、表示しているものが何を表しているのかを認識していません。フレームワークは、それを何と呼ぶか​​を認識しているだけです。

この方法で行うのは便利ですが、MVCの精神に違反していることがわかります。この場合、「モデル」は実際にはモデルではなく、マークアップアイテムのリスト(リストアイテム)を渡す方法にすぎません。

全体AddressViewModelをモデルとして使用します。そうすれば、そのプロパティの要件を示すデータ注釈からの情報を保持できます。

于 2013-03-06T21:08:52.097 に答える