Это просто странная причуда, которая пришла мне в голову:
Простое решение может заключаться в том, чтобы создать подкласс Address для OptionalAddress.
Не думаю, что обязательные атрибуты будут унаследованы длядочерний класс.
[AttributeUsage (Inherited = False)]
также приходит на ум при необходимости.
Еще одним решением MVCish может быть реализация привязки пользовательской модели (полностью непроверенная):
public override object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
var address = base.BindModel(controllerContext, bindingContext) as Address;
if (bindingContext.ModelName.EndsWith("BillingAddress"))
{
foreach (PropertyInfo p in address.GetType().GetProperties())
{
Attribute a = Attribute.GetCustomAttribute(p, typeof(RequiredAttribute));
if (a != null
&& propertyInfo.GetValue(address, null) == null
&& bindingContext.ModelState[bindingContext.ModelName
+ "." + p.Name].Errors.Count == 1)
{
bindingContext.ModelState[bindingContext.ModelName + "." + p.Name].Errors.Clear();
}
}
return address;
}