2013-11-02 6 views
0

Я читаю учебники и пытаюсь привыкнуть к использованию ViewModels и Validation. Я не уверен, будет ли валидация проходить по основной модели или модели просмотра, я бы предположил, что это будет в ViewModel. Но, похоже, не имеет смысла добавлять проверку на ViewModel, если я пытаюсь наследовать свойство класса, поэтому я оставил его на самой модели, но ошибки не отображаются. Возможно, модели неэффективны и их нужно немного перестроить?Проверка на модели или модели просмотра?

NameModel

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); 
} 

ответ

6

Все проверки должны быть выполнены в ViewModel.

В вашем случае RegisterViewModel является представлением данных о View, связанных public ActionResult Register(), что означает, вид возвращает RegisterViewModel объекта не name объекта.

ModelState.IsValid проверки проверяет ввод вида по [Register.cshtml] против типа он связан с [RegisterViewModel не name]

Таким образом, только атрибуты, применяемые к RegisterViewModel будут утверждаться.

Таким образом, вам необходимо выполнить проверку в ViewModel.

Это, в свою очередь, предоставляет вам дополнительную гибкость в возможности использовать различные правила проверки для различных ViewModels (хотя ViewModels связаны с одной и той же базовой модели)

EDIT: (с кодом предложения)

Никакие правила проверки не применяются к свойствам модели

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)

Смежные вопросы