.NET 4 MVC 2 Проверка с аннотациями, предупреждающими вместо ошибки - PullRequest
11 голосов
/ 18 июня 2011

Я использую .NET 4 с MVC 2 для проверки с аннотациями. Есть ли (простое) решение для возврата предупреждения вместо error ? Так что я могу получить зеленую или желтую коробку с сообщением типа «Вы не должны использовать этот контент, но вы можете».

Большое спасибо заранее! :)

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-файле.

Ответы [ 5 ]

2 голосов
/ 15 декабря 2011

Сначала я быстро прокомментирую, что я не уверен, что это хорошая идея!

Атрибут «Обязательный» имеет определенный «характер» - люди ожидают от него определенных вещей, когда они включают это в свои атрибуты. Если вы хотите использовать атрибуты для определения этого поведения, попробуйте описать, что вы делаете более точно, поэтому вместо вашего:

[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, поэтому наследование не будет концептуально правильным.

1 голос
/ 15 декабря 2011

Я не уверен, как это будет работать. Если пользователь не вводит данные, и данные принимаются, вы переходите на другую страницу, и они никогда не увидят предупреждающее сообщение. Это будет означать, что вам либо не нужно прогрессировать, показывать им предупреждение (а затем требовать от них что-то еще, чтобы прогрессировать), либо вам придется открывать диалоговое окно или оповещение, требующее от них одобрения продолжения.

Ни одно не очень хорошее решение с точки зрения удобства использования.

Как вы предлагаете пользователю увидеть предупреждение?

0 голосов
/ 24 ноября 2011

Я не думаю, что здесь есть какая-то необходимость использовать аннотации и проверять данные, используя их. Лучшее, что можно здесь сделать, - это написать JS-функцию, которая показывает тип подсказки, когда пользователь вводит какой-то ввод, который не соответствует некоторому условию ввода, поскольку вы все равно собираетесь это разрешить. Основная цель аннотаций данных - не допустить, чтобы входные данные, которые не соответствуют заданным условиям, не достигли БД.

0 голосов
/ 24 ноября 2011

Я не уверен, что DataAnnotations помогут в этом отношении. Вы всегда можете использовать пользовательские проверки на стороне клиента. Создайте пользовательский класс для передачи сообщения об ошибке клиенту

0 голосов
/ 18 июня 2011

Все атрибуты проверки имеют свойство 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*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...