Проверка Asp.net MVC Custom Client не отображается на экране

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

Validation Attribute 
public class WellTestRecordVal : ValidationAttribute , IClientValidatable
{
    private WellTestViewModel record;

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        record = (WellTestViewModel) validationContext.ObjectInstance;


        if (record.WtStartTime > record.WtEndtime)
            return new ValidationResult("This is my server val message.");

        return ValidationResult.Success;
    }


    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var startDate = DateTime.Today;

        var rule1 = new ModelClientValidationRule();
        rule1.ValidationType = "startdaterule";
        rule1.ErrorMessage = "this is my iclient val message.";

        return new[] {rule1};
    }

Я применил это к свойству на моей модели как таковой:

[WellTestRecordVal]
[DataType(DataType.DateTime)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-ddThh:mm:ss}")]
public DateTime WtStartTime { get; set; }

У меня в комплекте есть все файлы unobtrusive.js и validate.unobtrusive.js, которые мне нужны.

Мой взгляд имеет проверку элемента.

 <label>
                 <span>Start Date</span>
                    @Html.TextBoxFor(x => x.WtStartTime, "{0:yyyy-MM-ddThh:mm:ss}", new { @class = "form-control", @type = "datetime-local", id = "startDate" })
                    @Html.ValidationMessageFor(m => m.WtStartTime)
                </label>

Мой Jquery для представления как таковой.

 <script type="text/javascript">
$.validator.addMethod("startdaterule",
function(value, element, params) {
    var endDate = $("#endDate").val();
    if (value > endDate) {
        return false;
    }
    return true;

});

$.validator.unobtrusive.adapters.add("startdaterule",function(options) {
    options.rules["startdaterule"] = {};
    options.messages["startdaterule"] = options.message;
});

Я использую Ajax.BeginForm в представлении.

Я вижу, что сообщение в моем GetClientValidationRules попадает в представление, когда я его проверяю.

Чего мне не хватает, чтобы это отображалось в самом представлении? Я чувствую, что мне не хватает чего-то чрезвычайно простого, что я мог упустить из виду из нескольких ресурсов, которые я рассмотрел по этому вопросу.

2 ответа

Я смог сузить свою проблему после покупки книги. Профессиональный ASP.NET MVC 5. Мой синтаксис был очень близок. У меня было два вопроса. Во-первых, я не передал никаких параметров, чтобы проверить мои значения. Во-вторых, мне нужно было позвонить @Scripts.Render("~/bundles/jqueryval") до моего сценария проверки, который я отрисовываю. Недостаточно просто включить его. Порядок имеет значение.

Это другой подход, но для условной проверки я рекомендую использовать надежную проверку.

Для этого вам необходимо:

  1. установить простой пакет nuget
  2. добавлять mvcfoolproof.unobtrusive.js на ваши сценарии ( получить его отсюда)

Тогда вы можете использовать условную валидацию следующим образом:

public class MyModel 
{
    public DateTime WtStartTime { get; set; } 

    /* I want end time to be greater than or equal to start time */
    [GreaterThanOrEqualTo("WtStartTime", ErrorMessage="End should be >= Start")]
    public DateTime WtEndtime{ get; set; } 

}

Вот и все, вам не нужно писать свой собственный код JavaScript для проверки на стороне клиента. Просто отметьте, что вам нужно добавить ValidationSummary в ваше представление. Вам необходимо добавить следующую строку в ваше представление, и оно будет отображать сообщения об ошибках.

@Html.ValidationSummary(true, "", new { @class = "text-danger" })
Другие вопросы по тегам