.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 помогут в этом отношении. Вы всегда можете использовать пользовательские проверки на стороне клиента. Создание пользовательского класса для передачи сообщения об ошибке клиенту