Отображение HTML в сообщении проверки на пользовательской аннотации [дубликат]

Всякий раз, когда вы хотите использовать переменные переменные, вероятно, лучше использовать словарь. Поэтому вместо записи

$foo = "bar"
$$foo = "baz"

вы пишете

mydict = {}
foo = "bar"
mydict[foo] = "baz"

Таким образом, вы не будете случайно перезаписывать ранее существовавшие переменные (что является аспектом безопасности), и вы можете иметь разные " Пространства имен». [/ д2]

17
задан Brendan Green 24 June 2015 в 02:31
поделиться

4 ответа

Я думаю, что просто добавление атрибута «Range» будет работать

[Range(typeof(DateTime), "01/01/1900", "06/06/2079", ErrorMessageResourceType = typeof(Resources.Patient), ErrorMessageResourceName = "DateOfBirth_Range")] 
-3
ответ дан Paulo Lima 21 August 2018 в 23:09
поделиться
  • 1
    Если вы посмотрите на этот сайт asp.net/mvc/tutorials/mvc-5/introduction/adding-validation, то он говорит "Note: jQuery validation does not work with the Range attribute and DateTime. For example, the following code will always display a client side validation error, even when the date is in the specified range: [Range(typeof(DateTime), "1/1/1966", "1/1/2020")] You will need to disable jQuery date validation to use the Range attribute with DateTime. It's generally not a good practice to compile hard dates in your models, so using the Range attribute and DateTime is discouraged." – Cybercop 14 February 2014 в 13:46

Я бы сделал это с интерфейсом IValidatableObject из System.ComponentModel.DataAnnotations, что позволяет добавлять дополнительные правила проверки, где вы можете сделать гораздо большую проверку. Добавьте интерфейс в свой класс, а затем внедрите метод Validate, где вы можете сравнить StartDateTime с текущей датой / временем, а также сравнить EndDateTime с StartDateTime, например

public class MyClass : IValidatableObject
{               
    [Required(ErrorMessage="Start date and time cannot be empty")]
    //validate:Must be greater than current date
    [DataType(DataType.DateTime)]
    public DateTime StartDateTime { get; set; }

    [Required(ErrorMessage="End date and time cannot be empty")]
    //validate:must be greater than StartDate
    [DataType(DataType.DateTime)]
    public DateTime EndDateTime { get; set; }       

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        List<ValidationResult> results = new List<ValidationResult>();

        if (StartDateTime < DateTime.Now)
        {
            results.Add(new ValidationResult("Start date and time must be greater than current time", new []{"StartDateTime"}));
        }

        if (EndDateTime <= StartDateTime)
        {
            results.Add(new ValidationResult("EndDateTime must be greater that StartDateTime", new [] {"EndDateTime"}));
        }

        return results;
    }     
}

. только потенциальный недостаток этого заключается в том, что Validate работает на стороне сервера, а не в проверке jQuery.

4
ответ дан PhilPursglove 21 August 2018 в 23:09
поделиться

Нет необходимости отключать проверку даты jQuery (и это может вызвать другие проблемы). Вам просто нужно переопределить метод range для $.validator.

По умолчанию он работает с числовыми значениями (а затем возвращается к сопоставлению строк), поэтому вы можете добавить следующий скрипт ( после jquery.validate.js и jquery.validate.unobtrusive.js, но не завернуты в $(document).ready

$.validator.methods.range = function(value, element, param) {
    if ($(element).attr('data-val-date')) {
        var min = $(element).attr('data-val-range-min');
        var max = $(element).attr('data-val-range-max');
        var date = new Date(value).getTime();
        var minDate = new Date(min).getTime();
        var maxDate = new Date(max).getTime();
        return this.optional(element) || (date >= minDate && date <= maxDate);
    }
    // use the default method
    return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
};

. Затем вы можете использовать RangeAttribute в своем свойстве

[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
public DateTime Date { get; set; }
6
ответ дан Stephen Muecke 21 August 2018 в 23:09
поделиться
  • 1
    Это должно быть отмечено как принятый ответ. Спасибо, Стивен! – ClownCoder 24 September 2017 в 18:09

Обычно я использую это решение, когда хочу проверить что-то на сервере. Я знаю, что вы можете положиться на модель валидации, которую использует MVC, но когда я делаю проверки, я пытаюсь использовать отдельный проект, если мне нужно сделать для них единичный тест. Допустим, у вас есть два приложения: один рабочий стол и один веб-сайт, тогда оба могут совместно использовать ValidationProject вместо повторения кода в обоих приложениях для одного и того же «Просмотр» / «Экран». Идея здесь заключается в том, чтобы изолировать проект Validation как независимый проект вашего решения.

Итак, вы можете скачать проект FluentValidation от NuGet, FluentValidation использует правила внутри конструктора, вы можете увидеть здесь документацию https: //github.com/JeremySkinner/FluentValidation/wiki

Например, можно использовать это правило даты, например, вы можете также установить правила для своего значения min и вашего максимального значения:

public class CustomerValidator: AbstractValidator<Customer> {
  public CustomerValidator() {
                    RuleFor(customer => customer.startDate)
                    .NotNull()
                    .WithMessage("You should select a start date")
                    .Must(d => d.HasValue && d.Value <= DateTime.Today)
                    .WithMessage("The start date should not be greather than current month/year");
  }

Теперь внутри вашего контроллера

[HttpPost]
public ActionResult Index(Customer c)
{
  if(ModelState.IsValid)
  {
    var validator= new CustomerValidator();
    var valResult = validator.Validate(c);

    if (valResult.Errors.Count != 0)
    {
       valResult.Errors.ForEach(x => ModelState.AddModelError(x.PropertyName, x.ErrorMessage));
       return View(vm);
    }

    //Your code here
  }
}
0
ответ дан Zinov 21 August 2018 в 23:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: