ASP.NET MVC. Почему ModelState.IsValid возвращает значение true после того, как я установил ModelMetadata.IsRequired программно?

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

 public static void SetMetadata(this ViewUserControl control)
    {
        if (!string.IsNullOrEmpty((string)control.ViewData["labeltext"]))
            control.ViewData.ModelMetadata.DisplayName = (string)control.ViewData["labeltext"];

        if (control.ViewData["required"] != null)
            control.ViewData.ModelMetadata.IsRequired = (bool)control.ViewData["required"];
    }

У кого-нибудь есть идеи, почему ModelState.IsValid не будет обрабатывать поля, которые я установил для Required = true?

2 ответа

Проблема в том, что вы модифицируете ModelMetadata на ваше get запрос страницы. Эта информация не сохраняется, когда вы post к вашему действию (так как нет ViewStateМеханизм esque в MVC).

Помечен ли класс, который вы пытаетесь проверить, как partial? Если это так, вы можете использовать прохладный MetadataType атрибут для украшения класса с атрибутами проверки:

[MetadataType(typeof(JobOpening_Validation))]
public partial class JobOpening
{
     //JobOpening is generated by LinqToSql but I want to validate the Title Property
}

internal class JobOpening_Validation
{
    [Required]
    [StringLength(150, ErrorMessage = "Must be under 150 characters")]
    public string Title { get; set; }
}

Используя это "выбрасывание" (JobOpening_Validation) класс мы создаем те же свойства, которые мы хотим проверить на "цели" (JobOpening) учебный класс. Любое украшение атрибутов класса "throwaway" будет скопировано в "target" класс.

Если это не работает для вас, вы можете создать FilterAttribute и переопределить OnActionExecuting метод и выполнить проверку вашей модели там. Вы также сможете соответственно обновить состояние модели.

После экспериментов с использованием MvcExtensions - и неудачи, потому что было слишком сложно вставить его в мой проект. Я закончил поиском блестящего маленького проекта под названием " Свободная проверка".

Он прост в использовании и легко интегрируется с MVC.

Другие вопросы по тегам