Я пытаюсь заставить проверку работать в ASP.NET MVC 2, но без особого успеха.
У меня сложный класс, содержащий большое количество полей. (Не спрашивайте - это одна из тех ситуаций, которые лучшие практики не могут затронуть). Обычно это моя Модель и класс, сгенерированный LINQ-to-SQL.
Поскольку это сгенерированный код, я создал класс MetaData согласно http://davidhayden.com/blog/dave/archive/2009/08/10/AspNetMvc20BuddyClassesMetadataType.aspx.
public class ConsultantRegistrationMetadata
{
[DisplayName("Title")]
[Required(ErrorMessage = "Title is required")]
[StringLength(10, ErrorMessage = "Title cannot contain more than 10 characters")]
string Title { get; set; }
[Required(ErrorMessage = "Forename(s) is required")]
[StringLength(128, ErrorMessage = "Forename(s) cannot contain more than 128 characters")]
[DisplayName("Forename(s)")]
string Forenames { get; set; }
// ...
Я прикрепил это к частичному классу моего сгенерированного класса:
[MetadataType(typeof(ConsultantRegistrationMetadata))]
public partial class ConsultantRegistration
{
// ...
Поскольку моя форма сложная, она имеет ряд зависимостей, таких как списки выбора и т. Д., Которые я инкапсулировал в шаблон ViewModel, и включил модель ConsultantRegistration в качестве свойства:
public class ConsultantRegistrationFormViewModel
{
public Data.ConsultantRegistration ConsultantRegistration { get; private set; }
public SelectList Titles { get; private set; }
public SelectList Countries { get; private set; }
// ...
Так что это по сути ViewModel => Model
My View имеет:
<p>
<%: Html.LabelFor(model => model.ConsultantRegistration.Title) %>
<%: Html.DropDownListFor(model => model.ConsultantRegistration.Title, Model.Titles,"(select a Title)") %>
<%: Html.ValidationMessage("Title","*") %>
</p>
<p>
<%: Html.LabelFor(model => model.ConsultantRegistration.Forenames) %>
<%: Html.TextBoxFor(model => model.ConsultantRegistration.Forenames) %>
<%: Html.ValidationMessageFor(model=>model.ConsultantRegistration.Forenames) %>
</p>
Проблема в том, что атрибуты проверки в классе метаданных не имеют никакого эффекта. Я пытался сделать это через интерфейс, но тоже безрезультатно. Я начинаю думать, что причина в том, что я инкапсулирую свою модель в ViewModel.
Мой контроллер (Создать действие) выглядит следующим образом:
[HttpPost]
public ActionResult Create(Data.ConsultantRegistration consultantRegistration)
{
if (ModelState.IsValid) // this is always true - which is wrong!!
{
try
{
consultantRegistration = ConsultantRegistrationRepository.SaveConsultantRegistration(consultantRegistration);
return RedirectToAction("Edit", new { id = consultantRegistration.ID, sectionIndex = 2 });
}
catch (Exception ex)
{
ModelState.AddModelError("CreateException",ex);
}
}
return View(new ConsultantRegistrationFormViewModel(consultantRegistration));
}
Как указано в комментарии, свойство ModelState.IsValid всегда возвращает true, несмотря на то, что поля с аннотациями Validaiton являются недействительными. (Имена являются ключевым примером).
Я что-то упускаю из виду - учитывая, что я новичок в MVC? Я после механизма, продемонстрированного Джоном Гэллоуэем в http://www.asp.net/learn/mvc-videos/video-10082.aspx.
(Знаю, что t похоже на Проверка ASP.NET MVC Model / ViewModel , но этот пост, кажется, говорит о xVal. Я понятия не имею, что это такое, и подозреваю, что это для MVC 1)