Entity Framework 4.1でASP.Net MVC 3 Webアプリケーションを開発していますが、フォームの検証にData Annotationsを使用することについてちょっと混乱しています。 実際のオブジェクトを渡すのではなく、ViewModelをViewに返すのは、これが貧弱な方法であることを認識しているからです。たとえば:ASP.Net MVC 3 ViewModelデータ注釈
はpublic class ViewModelTeam
{
public Team Team { get; set; }
}
マイビューは、このビューを検証するには、この
@model UI.ViewModels.ViewModelTeam
@Html.HiddenFor(model => model.Team.teamID)
<div class="editor-label">
@Html.LabelFor(model => model.Team.description)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Team.description)
@Html.ValidationMessageFor(model => model.Team.description)
</div>
のようなものを持っているかもしれませんが、私はそのように
[MetadataType(typeof(TeamMetaData))]
public partial class Team
{
public class TeamMetaData
{
[DisplayName("Team Name")]
[Required(ErrorMessage = "Please enter a Team Name")]
public object description { get; set; }
など部分クラスでのデータ注釈を作成しました私が作成したコントローラで私はこれを持っています
[HttpPost]
public ActionResult Create(Team team)
{
if (ModelState.IsValid)
{
//Add team and redirect
}
//Got this far then errors have happened
//Add Model State Errors
ViewModelTeam viewModel = new ViewModelTeam
{
Team = team
};
return View(viewModel);
}
これはうまくいきますが、ViewModelsと検証に関する情報が増えれば増えるほど、ViewModelは検証されるはずです。なぜなら、その日の終わりには、ViewModelが表示されているからですビューではなく、オブジェクトです。
したがって、私は次のよう
public class ViewModelListItem
{
public int teamID { get; set; }
[DisplayName("Item Name")]
[Required(ErrorMessage = "Please enter a Team Name")]
public string description { get; set; }
のように見えるために私のViewModelを変更し、私も再びこの
[HttpPost]
public ActionResult Create(Team team)
{
if (ModelState.IsValid)
{
//Add team and redirect
}
//Got this far then errors have happened
//Add Model State Errors
ViewModelTeam viewModel = new ViewModelTeam();
viewModel.description = team.description;
return View(viewModel);
}
に私の作成コントローラーを変更し、これは動作しますが、私は感覚を得ます2番目の方法はこれを行う最初の方法ではちょっと混乱しているか、効率的ではありません。
私はこれに関する他の人の考えを聞くことに興味があります。ご協力いただきありがとうございます。私はこのような長い投稿をお詫び申し上げます。
、それぞれのプロパティをViewModelに割り当てる必要がありますか?つまり、viewModel.property1 = team.prop1、viewModel.property2 = team.prop2、viewModel.property3 = team.prop3 ... viewModel.property30 = team.prop30などです。これは非効率的だと思われますが、AutoMapperは何をしているのでしょうか?私はかつてこれを使ったことがない。 – tgriffiths
これは意味があります。素晴らしい答え。ありがとうございました。 – tgriffiths
共有のためのDarin Dimitrovありがとうございます。ちょうど質問ですので、ViewModelではDataAnnorationのみを使用し、モデルでは使用しないでください。これを見てくださいhttp://forums.asp.net/t/1502378.aspx – GibboK