17

Tôi đang đấu tranh để hiểu một số khái niệm cơ bản về xác nhận hợp lệ jQuery như được kết nối với ASP.NET MVC.Làm thế nào để tự kích hoạt tính năng xác nhận hợp lệ jQuery với ASP.NET MVC

Phiên bản ngắn của câu hỏi này là: Tôi thiếu điều gì cho phép mã được tạo bởi @Html.EditorFor() để thực hiện xác thực jQuery, nhưng không hoạt động Tôi cố gắng kết nối xác thực jQuery của riêng tôi bằng cách sử dụng cùng một HTML chính xác?

Như một bài tập học tập (và bởi vì nó bắt chước những gì tôi thực sự muốn làm trong trang web của tôi) Tôi tạo ra một ứng dụng MVC 4 mới trong Visual Studio 2012. Tôi đã thêm một mô hình điểm:

using System.ComponentModel.DataAnnotations; 
namespace ValidationTest.Models 
{ 
    public class MyViewModel 
    { 
     [Required] 
     public string MyStringValue { get; set; } 
    } 
} 

và tôi Lần sửa đổi \ Home \ Index.cshtml để tạo ra một hình thức dựa trên mô hình quan điểm của tôi như thế này:

@model ValidationTest.Models.MyViewModel 
@using (Html.BeginForm(new { id = "MyForm" })) { 
    @Html.LabelFor(m => m.MyStringValue) 
    @Html.EditorFor(m => m.MyStringValue) 
    @Html.ValidationMessageFor(m => m.MyStringValue) 

    <br /> 
    <input type="submit" value="Submit" /> 
} 

Cuối cùng, tôi sửa đổi bộ điều khiển Home để cung cấp các mô hình xem mẫu và xử lý POST liên quan, như điều này:

using System.Web; 
using System.Web.Mvc; 
using ValidationTest.Models; 

namespace ValidationTest.Controllers 
{ 
    public class HomeController : Controller 
    { 
     [HttpGet] 
     public ActionResult Index() 
     { 
      var viewModel = new MyViewModel(); 
      return View(viewModel); 
     } 

     [HttpPost] 
     public ActionResult Index(MyViewModel viewModel) 
     { 
      if (!ModelState.IsValid) return View(viewModel); 

      return RedirectToAction("About"); 
     } 

     public ActionResult About() 
     { 
      ViewBag.Message = "Your app description page."; 
      return View(); 
     } 

     public ActionResult Contact() 
     { 
      ViewBag.Message = "Your contact page."; 
      return View(); 
     } 
    } 
} 

Khi tôi chạy dự án, trang web sẽ hiển thị hộp văn bản và xác thực một cách kỳ diệu rằng người dùng phải nhập giá trị. Cho đến nay rất tốt ...

Bây giờ, ứng dụng thực tế của tôi là bản khảo sát trực tuyến. Nó hiển thị các câu hỏi và trả lời các câu trả lời dựa trên một kịch bản. Dạng xem thực tế của tôi chứa các thuộc tính ánh xạ tới văn bản của câu hỏi, giá trị do người dùng cung cấp, v.v. Chế độ xem cũng chứa thuộc tính Bắt buộc Boolean chỉ định người dùng có phải cung cấp giá trị hay không. "yêu cầu" xác nhận trong Xem) - vì vậy điều này có nghĩa rằng tôi cần phải loại bỏ các [Required] thuộc tính trên tài sản MyStringValue trong viewmodel của tôi và cung cấp ma thuật xác nhận của riêng tôi dựa trên tài sản bắt buộc trong viewmodel.

Đây là nơi tôi bị lạc. Trong IE, tôi có thể thấy rằng @ html.xxx gọi trong ứng dụng mẫu (nêu trên) tạo ra HTML này đối với hình thức:

<label for="MyStringValue">MyStringValue</label> 
<input class="text-box single-line" 
     data-val="true" 
     data-val-required="The MyStringValue field is required." 
     id="MyStringValue" 
     name="MyStringValue" 
     type="text" 
     value="" /> 
<span data-valmsg-for="MyStringValue" data-valmsg-replace="true"></span> 

Nhưng tôi không thấy bất kỳ HTML ở đâu đó trên trang đó rõ ràng là tài liệu tham khảo thư viện xác thực jQuery, cũng như tôi không thấy mã JavaScript cho phép xác thực, vì vậy tôi không hiểu tại sao nó lại hoạt động.

Hơn nữa, nếu tôi xóa thuộc tính [Required] và mã hóa cứng Chế độ xem để phát ra HTML ở trên (không có phép gọi @ html.xxx()) thì không có xác thực nào xảy ra.

Tôi đang thiếu gì?

+0

Lý do "Tôi không thấy bất kỳ HTML nào khác trên trang rõ ràng tham chiếu thư viện xác thực jQuery" là vì nó không có ở đó. Máy chủ biết cách thực hiện xác nhận hợp lệ dựa trên các thuộc tính xác nhận được áp dụng cho mô hình khung nhìn, nhưng xác nhận hợp lệ jQuery phía máy khách phải được kích hoạt một cách rõ ràng như được mô tả trong câu trả lời. –

Trả lời

12

Vâng, tôi đã bỏ lỡ điều gì đó thực sự cơ bản.

Mẫu trang (_Layout.cshtml) tạo ra cho một MVC 4 dự án mới chứa mã này ở cuối trang:

 @Scripts.Render("~/bundles/jquery") 
     @RenderSection("scripts", required: false) 
    </body> 
</html> 

Đó là mã kéo trong thư viện jQuery (sau khi tất cả các HTML trên trang đã được trình duyệt nhìn thấy) và sau đó hiển thị "phần" tùy chọn có thể được cung cấp bởi chế độ xem. Mã đó không không phải là kéo trong thư viện xác thực jQuery.

Xác thực ASP.NET MVC hoạt động mà không cần xác thực jQuery, nhưng tất cả xác thực được thực hiện trong máy chủ. Người quan sát cẩn thận sẽ lưu ý rằng, một khi đã cảnh báo rằng một giá trị chuỗi bị thiếu phải được cung cấp, xác thực phía máy khách sẽ làm cho cảnh báo biến mất bằng cách nhập một ký tự đơn vào hộp văn bản bị lỗi. Nhưng nếu không bật xác thực jQuery, việc nhập vào hộp văn bản sẽ không tự động xóa cảnh báo.

Để "bật" xác thực jQuery cho một chế độ xem duy nhất, mã này cần phải nằm ở đâu đó trong tệp cshtml của khung nhìn (theo phong cách, nó muốn ở cuối tệp vì nó sẽ hiển thị ở cuối của HTML):

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

Vì vậy, câu trả lời ngắn cho câu hỏi của tôi là thêm mã ở trên vào cuối tệp Views \ Home \ Index.cshtml của tôi. Điều này cho phép xác thực jQuery, phép thuật xảy ra và các thuộc tính data-xxx không bị bỏ qua nữa. Cuộc sống là tốt.

+1

https://app.pluralsight.com/player?author=scott-allen&name=mvc3-building-ajax&mode=live&clip=4&course=aspdotnet-mvc3-intro – Waqar

10

Không có phép thuật nào bạn thiếu. Kịch bản 'xác nhận không phô trương' của Microsoft có thể được sử dụng trong bất kỳ trang web nào sử dụng tính năng xác thực jquery và jquery. Nó không liên quan đến ASP.NET - miễn là HTML là định dạng mà kịch bản không phô trương mong đợi, thì kịch bản lệnh sẽ hoạt động. This fiddle shows the unobtrusive script applied to a form not produced by ASP.NET.

Kịch bản phô trương có hai nhiệm vụ chính:

  1. Khởi tạo jquery.validate.js Plugin
  2. Đọc dữ liệu val * thuộc tính trong đánh dấu và dịch này vào quy tắc Validate jquery

As you may have read, đánh dấu các thuộc tính mà kịch bản không phô trương lần đọc như sau

data-val="true" 
data-val-rulename="message" 
data-val-rulename-paramname1="paramvalue" 
data-val-rulename-paramname2="paramvalue" 

nên trường nhập có thể trông giống như thế này

<input 
    data-val="true" 
    data-val-required="This field is required..." 
    data-val-number="Please enter a number..." 
    data-val-range="Must be between 50 and 100...", 
    data-val-range-min="50" 
    data-val-range-max="100" 
    id="mynumber" 
    name="mynumber" 
    type="text" value="" /> 

Ý kiến ​​cá nhân của tôi về âm thanh không phô trương t là nó rơi vào danh mục những gì Steve Sanderson gọi là 'demoware' trong his MVC book. Nó làm một số công cụ tốt đẹp ra khỏi hộp nhưng it hobbles jquery validate đó là dễ dàng hơn nhiều để sử dụng trên riêng của mình. Tôi có xu hướng xóa nó khi tôi bắt đầu một dự án mới.

+1

+1 để có giải thích tuyệt vời. Đánh dấu xấu xí như vậy với "không phô trương" ... Tôi đồng ý, bạn sẽ có quyền kiểm soát nhiều hơn chỉ bằng cách sử dụng plugin jQuery Validate như được thiết kế. – Sparky