Проверка не работает на ViewModel

Хорошо, у меня есть ViewModel, которая выглядит так:

public class UserLogin
{
    [Required]
    public string EmailAddress { get; set; }

    [Required]
    public string Password { get; set; }
}

Мой контроллер выглядит так:

[HttpPost]
public ActionResult LogIn(UserLogin model)
{
    if (!ModelState.IsValid)
    {
        // ...
    }
}

Мой взгляд выглядит так:

<% Html.BeginForm("Join", "User", FormMethod.Post); %>
    <%= Html.Hidden("ReturnUrl", Request.Url.AbsolutePath) %>

    <%= Html.TextBoxFor(c => c.EmailAddress, new { id = "join-emailaddress", @class = "text", uiHintText = "Email address" })%>
    <%= Html.ValidationMessageFor(c => c.EmailAddress, "*") %>

    <%= Html.PasswordFor(c => c.Password, new { id = "join-password", @class = "text", uiHintText = "Password" })%>
    <%= Html.ValidationMessageFor(c => c.Password, "*")%>

    <%= Html.PasswordFor(c => c.PasswordConfirm, new { id = "join-password-confirm", @class = "text", uiHintText = "Password (repeat)" })%>
    <%= Html.ValidationMessageFor(c => c.PasswordConfirm, "*")%>

    <input type="submit" value="Sign me up!" class="submit" />
<% Html.EndForm(); %>                

Если я отправляю форму, ничего не вводя ни в одно из полей, я постоянно получаю значение «истина» для «ModelState.IsValid».

Разве это не должно быть «ложно», поскольку я пометил эти поля как «Обязательные» и не ввел никаких значений?


person Jonathan    schedule 13.02.2010    source источник


Ответы (3)


Взгляните на последнюю версию RC для ASP.NET MVC. Он включает в себя некоторые исправления для этого.

http://haacked.com/archive/2010/02/04/aspnetmvc2-rc2.aspx

В частности, из примечаний к выпуску:

Система проверки по умолчанию проверяет всю модель
Система проверки по умолчанию в ASP.NET MVC 1.0 и в предварительных версиях ASP.NET MVC 2 до RC 2 проверяла только свойства модели, которые были отправлены на сервер. В ASP.NET MVC 2 RC2 новое поведение заключается в том, что все свойства модели проверяются при проверке модели, независимо от того, было ли опубликовано новое значение.

Для получения дополнительной информации об этом изменении см. следующую публикацию в блоге Брэда Уилсона:

Проверка входных данных и проверка модели в ASP.NET MVC
http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html

person Robert Harvey    schedule 13.02.2010
comment
Я обновился до ASP.NET MVC 2 RC 2, но у меня все еще та же проблема. Не похоже, чтобы обновление что-то изменило. - person Jonathan; 14.02.2010
comment
Я думаю, что теперь это исправлено, но странное исправление ... См. Мой комментарий под ответом @H_Sampat. - person Jonathan; 14.02.2010


Я выяснил причину моей конкретной проблемы.

При использовании атрибута [Required] в моих свойствах ViewModel я указал тип ресурса и имя ресурса для ошибки.

Пример:

[Required(ErrorMessageResourceName = "FirstNameError", 
          ErrorMessageResourceType = typeof(MyResourceFile))]
public string FirstName { get; set; }

Однако я забыл сделать ресурс FirstNameError общедоступным; он все еще был помечен как «внутренний» и, следовательно, недоступен.

После того, как он был опубликован, все заработало, и ModelState.IsValid содержал правильное значение.

Я поражен тем, что не было обнаружено никаких ошибок, и это молча не удалось, но теперь я знаю, почему.

(Да, я должен был с самого начала упомянуть, что я использовал ресурсы. Я ошибочно думал, что это не имеет значения, но это оказалось очень важно.)

person Jonathan    schedule 14.02.2010
comment
Обязательно сообщите об этом Филу Хааку, если считаете, что это настоящий баг. haacked.com/contact.aspx. Было бы здорово, если бы это было в финальной версии. - person Robert Harvey; 15.02.2010
comment
Отличная идея! Я отправил сообщение Филу. - person Jonathan; 17.02.2010