10

Tôi đang sử dụng Visual Studio 2012 và tôi không thể có được một thuộc tính tùy chỉnh phía khách hàng thuộc tính để làm việc để tái tạo ở quy mô nhỏ hơn, tôi đã tạo một dự án MVC 4 mới. mô hình và thuộc tính đó sẽ không bao giờ xác nhậnASP.NET MVC 4 - Xác nhận Clientside không hoạt động

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" 
     }; 
    } 
} 

sau đó tôi có những hành động sau đây bổ sung vào HomeController

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

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

    return View(model); 
} 

Ngoài ra còn có một file javascript gọi nevervalid.js

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

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

và Index Xem

@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") 
} 

Các lĩnh vực có liên quan trong web.config của tôi trông như thế này

<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> 

khi tải trang, các tập tin sau đây được nạp (nhận này từ tab mạng dưới chrome's 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 

và thuộc tính tùy chỉnh của tôi thêm có liên quan tìm đĩa dữ liệu công cụ để tên đầu vào đầu tiên như vậy ...

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

vậy, tôi hỏi bạn, tại sao oh tại sao điều này phải postback để làm xác nhận serverside trong khi tôi có một số hoàn hảo tìm mã javascript ở đây? Tôi có phải hy sinh một số động vật vào một đêm không trăng trên đỉnh đồi ở đâu đó không?

+0

Liệu sự giúp đỡ này, có vẻ như bạn đang không trọng tất cả các chức năng cần thiết trong thuộc tính xác nhận của bạn. http://stackoverflow.com/questions/8284207/asp-net-mvc-implement-custom-validator-use-iclientvalidatable –

+0

Xin chào, Patrick, cảm ơn đã dành thời gian của bạn để xem xét vấn đề, Trong sự vội vã của tôi để có được mã tái tạo nhỏ nhất, tôi bỏ qua lần ghi đè IsValid thứ hai ... nó vẫn không hoạt động ... Tôi nghĩ tôi phải trải qua tất cả các câu hỏi SO liên quan. nhưng không có gì ... Tôi hy vọng rằng ai đó có thể tái tạo nó vào cuối thế giới của họ, xác nhận tôi aint sẽ điên rồ ... – G2Mula

Trả lời

18

Tôi tự hỏi điều gì sẽ xảy ra nếu bạn thay đổi nevervalid.js để mã thực thi trước khi tài liệu sẵn sàng. Tư duy cơ bản của tôi là xác thực không phô trương hoạt động bằng cách phân tích cú pháp tài liệu khi dom đã sẵn sàng ... nhưng nếu bạn đang tải công cụ xác thực tùy chỉnh cùng một lúc/sau đó, nó sẽ không biết phải làm gì khi nó đi qua bạn thuộc tính dữ liệu xác thực tùy chỉnh.

Dù sao, hãy thử thay đổi nevervalid.js chỉ đơn giản là:

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

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

Bạn là chính() est! – G2Mula

+0

yea, vẫn hoạt động và bản chỉnh sửa trông ít "khỏa thân" hơn, sử dụng jQuery quá lâu và có một số thứ trong đó tôi quên hỏi ý nghĩa của chúng ... – G2Mula

+2

Tất cả đều tốt, vui vì nó đã khắc phục được sự cố . Chỉnh sửa chỉ là một điều thực hành tốt nhất :-) – Charlino