Проверка не работает на ViewModel - PullRequest
3 голосов
/ 13 февраля 2010

Хорошо, у меня есть 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(); %>                

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

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

Ответы [ 3 ]

2 голосов
/ 13 февраля 2010

Посмотрите последнюю версию 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

1 голос
/ 15 февраля 2010

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

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

Пример:

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

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

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

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

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

1 голос
/ 13 февраля 2010

У меня была такая же проблема ранее, но я использовал ASP.NET MVC1. Однако я решил проблему, добавив следующий код в файл Global.asax.vb.

Sub Application_Start()
    RegisterRoutes(RouteTable.Routes)

    'Added following line
    ModelBinders.Binders.DefaultBinder = New Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder()        
End Sub

Вам нужно будет импортировать Microsoft.Web.Mvc.DataAnnotations.dll. Вы можете получить его от http://aspnet.codeplex.com/releases/view/24471

...