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.