Сначала я быстро прокомментирую, что я не уверен, что это хорошая идея!
Атрибут «Обязательный» имеет определенный «характер» - люди ожидают от него определенных вещей, когда они включают это в свои атрибуты. Если вы хотите использовать атрибуты для определения этого поведения, попробуйте описать, что вы делаете более точно, поэтому вместо вашего:
[Required(WarningMessage = "It is recommended to fill out age...")]
public int Age { get; set; }
Я бы имел:
[PreSubmitWarningMessage("It is recommended to fill out age...")]
public int Age { get; set; }
Вы можете создавать свои собственные атрибуты, которые будут влиять на обработку запроса, хотя это не будет распространяться на проверку на стороне клиента, как это делают стандартные атрибуты MVC.
Чтобы это хорошо сочеталось с MVC, вам нужно создать его как Фильтр действий - в частности, путем реализации ActionFilterAttribute и переопределения метода OnActionExecuted:
public class PreSubmitWarningMessage : ActionFilterAttribute
{
private string _warningMessage;
public PreSubmitWarningMessage(string warningMessage)
{
_warningMessage = warningMessage;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// stuff you do here will happen before the
// controller action is executed.
// you can compare the private warning message
// to the metadata in filterContext
}
}
Вы могли бы сделать пару вещей здесь, я не уверен, какой будет лучшая практика, но в самом лучшем случае, у вас есть доступ к модели в filterContext, так что вы можете изменить поведение действия вашего контроллера, обновив ваш вид модели в определенном состоянии, если ваше условие предупреждения (в этом случае, это поле является обязательным).
Люди могут утверждать, что просто расширяют RequiredAttribute, но я не думаю, что правильно говорить, что ваш новый атрибут IS RequiredAttribute, поэтому наследование не будет концептуально правильным.