.NET 4 MVC 2 Проверка с предупреждением аннотаций вместо ошибки
Я использую .NET 4 с MVC 2 для проверки с помощью аннотаций. Есть ли (простое) решение для возврата предупреждения вместо ошибки? Так что я могу получить зеленый или желтый ящик с сообщением типа "вы не должны использовать этот контент, но можете".
Большое спасибо заранее!:)
EDIT:
Обратите внимание, что я уже могу выкинуть ошибки с помощью ErrorMessage
, но я дополнительно хочу что-то вроде WarningMessage
или InfoMessage
, чтобы пользователь получал предупреждение, но мог продолжить. Есть ли решение для этого?
Псевдокод будет:
(Обратите внимание на "псевдо", потому что WarningMessage
(к сожалению) не является допустимым классом)
public class Person
{
[StringLength(50)]
[Required(ErrorMessage = "You MUST enter a name!")]
public string Name { get; set; }
[Required(WarningMessage = "It is recommended to fill out the age but you may leave it out)]
public int Age { get; set; }
}
И да Я хочу, чтобы это было центрировано в моем классе проверки, а не где-то в .js файле.
Ответы
Ответ 1
Сначала я быстро прокомментирую, что я не уверен, что это хорошая идея!
"Обязательный" атрибут имеет определенный "символ" - люди ожидают определенных вещей, когда они включают это в их атрибуты. Если вы хотите использовать атрибуты для определения этого поведения, попробуйте описать, что вы делаете более точно, поэтому вместо вашего:
[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, вам необходимо создать это как Action Filter - в частности, путем реализации 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 обязательный атрибут, поэтому наследование не будет концептуально корректным.
Ответ 2
Я не уверен, как это будет работать. Если пользователь не вводит данные, и данные приняты, то вы переходите на другую страницу и никогда не увидите предупреждающее сообщение. Это означало бы, что вам придется либо не прогрессировать, показывая им предупреждение (а затем требуя, чтобы они сделали что-то еще для прогресса), или вам нужно будет открыть диалог или предупреждение, требующие от них одобрения.
Не очень хорошее решение с точки зрения удобства использования.
Как вы предлагаете пользователю увидеть предупреждение?
Ответ 3
Все атрибуты проверки имеют свойство ErrorMessage. Вы можете сообщить свое собственное сообщение об ошибке
public class Product
{
[StringLength(50)]
[Required(ErrorMessage = "Your user friendly message")]
public string Name { get; set; }
}
Затем измените стили CSS сообщений об ошибках.
/* Styles for validation helpers
-----------------------------------------------------------*/
.field-validation-error
{
color: #ff0000;/*change the color*/
}
/*Other validation related styles*/
Ответ 4
Я не думаю, что есть необходимость использовать аннотации и проверять данные, используя это здесь. Самое лучшее, что можно сделать здесь, это написать функцию JS, которая отображает тип сообщения типа подсказки, когда пользователь дает какой-то ввод, который не может выполнить какое-либо условие ввода, поскольку вы все равно разрешите его. Основная цель аннотаций данных состоит в том, чтобы не допускать ввода, которая не позволяет определенным условиям достичь дБ.
Ответ 5
Я не уверен, что DataAnnotations помогут в этом отношении. Вы всегда можете использовать пользовательские проверки на стороне клиента. Создание пользовательского класса для передачи сообщения об ошибке клиенту