Модель ASP.NET MVC 2, инкапсулированная в валидацию ViewModel - PullRequest
0 голосов
/ 01 апреля 2010

Я пытаюсь заставить проверку работать в 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)

1 Ответ

1 голос
/ 01 апреля 2010

Я пытался заставить это работать в течение некоторого времени. Основываясь на коде, который вы включили, я думаю, что вы делаете все правильно.

Я думаю, что проблема в валидаторах JavaScript, которые, как предполагается, «выбрасываются» на страницу. Здесь есть несколько других вопросов, связанных с этой проблемой, и я не думаю, что кто-либо из них предлагает решение, которое работает по всем направлениям. Насколько я могу судить, MVC2 RC все еще не работает.

UPDATE:

Если это работает, когда вы применяете атрибуты к выдаваемому коду, посмотрите на это:

При использовании аннотаций данных с MVC, Pro и минусами использования интерфейса вместо MetadataType

Это может быть атрибут MetadataType, который не работает. Это работает, если вы попробуете интерфейс, как предложено в вопросе выше?

Также еще один вопрос: Тип метаданных и проверка клиента в ASP.NET MVC 2

Это довольно недавно и подтверждает, что это все еще ошибка в MVC2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...