0

私はチュートリアルを読んで、ViewModels と Validation の使用に慣れようとしています。検証がメインのモデルとビュー モデルのどちらで行われるかはわかりませんが、ビューモデルで行われると思います。しかし、クラス プロパティを継承しようとしている場合、ViewModel に検証を追加する意味がないように思われるため、モデル自体に残しましたが、エラーは表示されません。おそらく、モデルは非効率的で、少し再配置する必要がありますか?

名前モデル

 public class name {
      [StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)]
      public string first { get; set; }
      public string middle  { get; set; }
      [StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)]
      public string last  { get; set; }
      public string otherstuffnotneededontheview { get; set; }
 }

RegisterViewModel

 public class RegisterViewModel {
     public name fname { get; set; }
     public name lname { get; set; }
 }

意見

 @model Project.ViewModels.RegisterViewModel

 @using (Html.BeginForm())
 {
     <label>
     @Html.TextBoxFor(model => model.fname.first)
     @Html.ValidationMessageFor(model => model.fname.first)
     </label>

     <label>
     @Html.TextBoxFor(model => model.lname.last)
     @Html.ValidationMessageFor(model => model.lname.last)
     </label>
     <input type="submit" />
 }

コントローラ

 public ActionResult Register()
 {
      RegisterViewModel model = new RegisterViewModel();
      return View(model);
 }

 [HttpPost]
 public ActionResult Register(RegisterViewModel model)
 {
       return View(model);
 }
4

1 に答える 1

6

すべての検証は ViewModel で行う必要があります。

あなたの場合、 RegisterViewModel は関連付けられたビューのデータ表現です。つまり、ビューはオブジェクトではなくオブジェクトpublic ActionResult Register()を返します。RegisterViewModelname

ModelState.IsValidRegisterViewModelビューの入力 [Register.cshtml] を [ not name]にバインドされている型に対して検証します。

したがって、に適用された属性のみRegisterViewModelが検証されます。

そのため、ViewModel で検証を実行する必要があります。

これにより、異なる ViewModel に対して異なる検証ルールを使用できるという追加の柔軟性が提供されます (ただし、ViewModel は同じ基になるモデルにバインドされます)。

編集:(コードの提案あり)

モデル プロパティに検証規則は適用されません

public class name {
      public string first { get; set; }
      public string middle  { get; set; }
      public string last  { get; set; }
      public string otherstuffnotneededontheview { get; set; }
 }

代わりに ViewModel に適用されます

public class RegisterViewModel {
     [StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)]
     public string fname { get; set; }
      [StringLength(50, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 3)]
     public string lname { get; set; }
 }

この変更で十分です (適切に にバインドRegisterViewModelしていると思いますname) 。

于 2013-11-02T18:31:26.130 に答える