10

Я использую Visual Studio 2012, и я не могу получить логику клиентской стороны пользовательского атрибута для работы для воспроизведения в меньшем масштабе, я создал новый проект MVC 4, я создал следующее модель и атрибутов, которые никогда не проверятьASP.NET MVC 4 - Clientside Validation Not Working

public class MyModel 
{ 
    public int Id { get; set; } 
    [Required] 
    public string LastName { get; set; } 
    [NeverValid(ErrorMessage="Serverside Will Never Validate")] 
    public string FirstName { get; set; } 
} 

public class NeverValidAttribute : ValidationAttribute, IClientValidatable 
{ 
    public override bool IsValid(object value) 
    { 
     return false; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     return new ValidationResult(this.ErrorMessage, new[] { validationContext.MemberName }); 
    } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     yield return new ModelClientValidationRule 
     { 
      ErrorMessage = this.ErrorMessage, 
      ValidationType = "nevervalid" 
     }; 
    } 
} 

Я тогда следующие добавлены в HomeController

public ActionResult Index() 
{ 
    return View(new MyModel()); 
} 

[HttpPost] 
public ActionResult Index(MyModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     // Will Always Be Invalid 
    } 

    return View(model); 
} 

действия Существует также Java-файл с именем nevervalid.js

$(function() { 
    $.validator.addMethod("nevervalid", function() { 
     return false; 
    }, "Clientside Should Not Postback"); 

    $.validator.unobtrusive.adapters.addBool("nevervalid"); 
}); 

и индекс Просмотр

@model CustomAttribute.Models.MyModel 

@{ 
    ViewBag.Title = "Home Page"; 
} 

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>MyModel</legend> 

     @Html.HiddenFor(model => model.Id) 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.LastName) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.LastName) 
      @Html.ValidationMessageFor(model => model.LastName) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.FirstName) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.FirstName) 
      @Html.ValidationMessageFor(model => model.FirstName) 
     </div> 

     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 
} 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
    @Scripts.Render("~/Scripts/nevervalid.js") 
} 

Соответствующие области в моем web.config выглядеть следующим образом

<appSettings> 
    <add key="webpages:Version" value="2.0.0.0" /> 
    <add key="webpages:Enabled" value="false" /> 
    <add key="PreserveLoginUrl" value="true" /> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
</appSettings> 

при загрузке страницы, следующие файлы загружаются (получил это от сети вкладка под хром F12)

http://localhost:7440/ 
http://localhost:7440/Content/site.css 
http://localhost:7440/Scripts/modernizr-2.5.3.js 
http://localhost:7440/Scripts/jquery-1.7.1.js 
http://localhost:7440/Scripts/jquery.unobtrusive-ajax.js 
http://localhost:7440/Scripts/jquery.validate.js 
http://localhost:7440/Scripts/jquery.validate.unobtrusive.js 
http://localhost:7440/Scripts/nevervalid.js 

и мой пользовательский атрибут добавляет релевантность нт ищет DATA- материала для первого ввода имени, как так ...

<input class="text-box single-line valid" data-val="true" data-val-nevervalid="Serverside Will Never Validate" id="FirstName" name="FirstName" type="text" value=""> 

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

+0

ли эта помощь, кажется, вы не перекрывая все требуемые функции в атрибуте проверки. http://stackoverflow.com/questions/8284207/asp-net-mvc-implement-custom-validator-use-iclientvalidatable –

+0

Привет, Патрик, спасибо, что нашли время, чтобы посмотреть на проблему. В моей спешке получить самый маленький воспроизводимый код, я упустил второе переопределение IsValid ... все равно он не работает ... Думаю, я должен был пройти все связанные с этим вопросы. но ничего ... Я надеюсь, что кто-то сможет воспроизвести его на краю света, подтвердите, что я не схожу с ума ... – G2Mula

ответ

18

Мне интересно, что произойдет, если вы изменили nevervalid.js так, чтобы код выполнялся до того, как документ будет готов.

Основное мое мнение состоит в том, что ненавязчивая проверка выполняется путем разбора документа, когда дом готов ... но если вы загружаете свой собственный материал для проверки в одно и то же время/после этого, он не будет знать, что делать когда он приходит через вас, пользовательский атрибут данных валидации.

Во всяком случае, попробуйте изменить nevervalid.js просто быть:

(function($) { 
    $.validator.addMethod("nevervalid", function() { 
     return false; 
    }, "Clientside Should Not Postback"); 

    $.validator.unobtrusive.adapters.addBool("nevervalid"); 
})(jQuery); 
+1

Ты главный() est! – G2Mula

+0

Да, все еще работает, и редактирование выглядит гораздо менее «голым», слишком долго использует jQuery, и в нем есть кое-что. Я забыл спросить, что они на самом деле означают ... – G2Mula

+2

Все хорошо, рад, что исправил проблему , Редактирование было только лучшей практикой :-) – Charlino