2013-01-21 29 views
26

Gặp sự cố khi tải plugin jQuery Validate để phát đẹp.Tại sao <form> được cấp thuộc tính NoValidate?

Mẫu

public class FooVM 
{ 
    [Required] 
    public string Name { get; set; } 
} 

Layout

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8" /> 
     <script src="@Url.Content("~/scripts/jquery-1.9.0.min.js")" type="text/javascript"></script> 
     <script src="@Url.Content("~/scripts/jquery-migrate-1.0.0.min.js")" type="text/javascript"></script> 
     <script src="@Url.Content("~/scripts/jquery.validate.min.js")" type="text/javascript"></script> 
     <script src="@Url.Content("~/scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 
     <script src="@Url.Content("~/scripts/bootstrap.min.js")" type="text/javascript"></script> 
     <link href="@Url.Content("~/content/bootstrap-responsive.min.css")" rel="stylesheet" type="text/css" /> 
     <link href="@Url.Content("~/content/bootstrap.min.css")" rel="stylesheet" type="text/css" /> 
     <title>@ViewBag.Title</title> 
    </head> 
    <body> 
    <div class="container"> 
     <div class="row"> 
      <div class="span12"> 
       <div class="navbar"> 
        <div class="navbar-inner"> 
         <a class="brand" href="#">idoneit</a> 
         <ul class="nav"> 
          <li class="menu-link">@Html.ActionLink("Home", "index", "bar")</li> 
         </ul> 
        </div> 
       </div> 
      </div> 
      <div class="span12 error-container"> 

      </div> 
      <div class="span12 main-body"> 
       @RenderBody() 
      </div> 
     </div> 
    </div> 
    </body> 
</html> 

Xem

model bootstrapvalidate.Models.FooVM 
@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

@using (Html.BeginForm("add", "bar", FormMethod.Post, new { @class = "form-horizontal" })) 
{ 
    <fieldset> 
     @Html.ValidationSummary() 
     <legend>Testing Bootstrap & Validate</legend> 
     <div class="control-group"> 
      <label for="Name" class="control-label">Name</label> 
      <div class="controls"> 
       @Html.TextBoxFor(x => x.Name) 
      </div> 
      <button type="submit" class="btn">Add!</button> 
     </div> 
    </fieldset> 
} 

Khi tôi nộp, thông báo lỗi được hiển thị một thời gian ngắn và sau đó là hình thức viết lại anyway.

Một điều tôi đã nhận thấy mà tôi chưa từng thấy trước đây là đánh dấu chứa 'novalidate' thuộc tính

<form action="/bar/add" class="form-horizontal" method="post" novalidate="novalidate">  

Từ các bit Tôi đã đọc, đây là HTML5 thuộc tính có thể ngăn chặn xác nhận. Vì vậy, yeah, đây là những gì đang gây ra nó tôi giả định.

Câu hỏi là - tại sao bejesus được thêm vào biểu mẫu? Tôi đã không yêu cầu nó!

chỉnh sửa: đã làm một chút đào dựa trên câu trả lời @ Rob 's, có vẻ như jquery validate được ném một ngoại lệ, vì thế mà postback ..

Debugging Outcome

đây là jquery.validate 1.10

+3

Theo [trang plugin] (http://bassistance.de/jquery-plugins/jquery-plugin-validation/), phiên bản 1.10 có chỉ được thử nghiệm thông qua jQuery 1.8. – Sparky

Trả lời

5

Đây thực sự là một câu hỏi khó hiểu về phần tôi nghĩ.

Về cơ bản, vấn đề không phải là thuộc tính novalidation (như @robasta đã nói).

Tôi không thể tải jQuery 1.9 và jQuery.Validate 1.10 để phát độc đáo. Chuyển trở lại jQuery 1.83 cố định nó ngay lập tức, tất cả làm việc như tôi mong đợi.

+1

Phiên bản 1.10 chỉ được thử nghiệm thông qua jQuery 1.8.x – Sparky

+0

Sẽ dạy cho tôi kỹ lưỡng hơn trước khi chơi, tôi chỉ thực sự muốn thử Boostrap :) – glosrob

+0

bạn nên báo cáo một lỗi, nó đã giúp tôi (và tôi hy vọng nhiều những người khác) với một bộ sưu tập ảnh – vladkras

24

thuộc tính novalidate được thêm bởi dòng jquery.validate 32:

// Add novalidate tag if HTML5. 
this.attr('novalidate', 'novalidate'); 

Nếu bạn đang sử dụng HTML5, then remove the attribute:

$("#contactForm").validate(); 
$("#contactForm").removeAttr("novalidate"); 

Trong web.config của bạn, hãy chắc chắn bạn có:

<appSettings>   
    ... 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
    </appSettings> 

Ngoài ra hãy chắc chắn rằng họ không được nhận xét ra.

+0

Xin chào, nhưng cả hai đều ở đó và không nhận xét được – glosrob

+0

tôi đã cập nhật câu trả lời. – robasta

+6

Để làm rõ, sự hiểu biết của tôi là 'novalidate' được cho là có để tắt xác thực HTML5, bởi vì bạn không muốn cả xác thực HTML5 (được thực hiện trong trình duyệt) và xác thực jQuery cho cả hai đang cố gắng xác thực biểu mẫu, họ sẽ tạo ra các popup lỗi trùng lặp sẽ lộn xộn. – AaronLS

2

Từ quét nhanh và đọc qua các nhận xét trước, tôi nhận thấy rằng nếu bạn có thuộc tính data-val=true trên bất kỳ mục nào trong biểu mẫu, thuộc tính novalidate sẽ tự động được chèn bởi jquery.validate.

Điều này có ý nghĩa bởi vì nếu bạn đang sử dụng các thuộc tính đó thì có một cái gì đó mà bạn không có ý định đi qua xác nhận, do đó thuộc tính novalidate; tuy nhiên, bằng cách đọc lên thuộc tính html5 novalidate trên w3schools, bạn có thể ghi đè lên mặc định novalidate; tập lệnh jquery.validate mới phải tính đến điều này.

Tôi nghĩ đó là gầy, hãy cho tôi biết nếu có ai đồng ý.

1

thay đổi

// Add novalidate tag if HTML5. 
this.attr('novalidate', 'novalidate'); 

để

// Add novalidate tag if HTML5. 
    if (typeof (Worker) !== "undefined") { this.attr('novalidate', 'novalidate'); 
Các vấn đề liên quan