Я отслеживаю неожиданное поведение в MVC3, связанное с тем, как он получает метаданные модели.
Ранее я говорил с одним из моих разработчиков об использовании одного и того же EditorTemplate для некоторых данных, которые собираются в двух разных областях системы. Поля данных практически идентичны, за исключением атрибута [Обязательный]. На одной странице определенные поля обязательны для заполнения, на другой - нет. Теоретически это может быть достигнуто путем использования базовой модели, которая имеет общие атрибуты в каждом поле, и наследования этих моделей, переопределения свойств и добавления дополнительных атрибутов проверки. Например:
class BaseModel
{
[Display(Name=”My Label”)]
public virtual string MyLabel { get; set ;}
}
class RequiredModel : BaseModel
{
[Required]
public override string MyLabel { get; set ;}
}
Тогда представление может быть строго типизировано в BaseModel, и вызовы @ Html.EditorFor (m => m.MyLabel) в представлении должны подобрать правильные атрибуты, в зависимости от того, является ли фактический экземпляр модели BaseModel. или RequiredModel.
Это теория.
И на самом деле, это работает хорошо, если вы используете «старый» помощник HTML, например @ Html.TextBox ( «MyLabel»). Они вызывают ModelMetadata.FromStringExpression (field), которая правильно получает метаданные из RequiredModel, если конкретный экземпляр модели - RequiredModel. Более новые вспомогательные методы вызывают ModelMetadata.FromLambdaExpression (выражение), которое НЕ правильно получает метаданные из правильного конкретного экземпляра.
Это ошибка в MVC? Преднамеренное поведение? Есть ли обходной путь или лучший способ решения этой проблемы?
Это, конечно, тривиальный пример, фактический код, с которым мы имеем дело, имеет около 20 полей с некоторыми сложными бизнес-правилами и взаимодействием, которые одинаковы на обеих страницах, КРОМЕ для полей, обязательных для заполнения.