8

Tôi đã tạo một khung nhìn một phần trong ứng dụng MVC 3. Quan điểm này có một mô hình mạnh mẽ gõ như thế này:ASP.NET MVC PartialView không phát ra đánh dấu xác nhận

public class ProductViewModel 
{ 
    [Required, Display(Name = "Product price")] 
    public decimal? ProductPrice 
    { 
     get; 

     set; 
    } ... 
} 

Trong phương pháp hành động của tôi, tôi gọi phương thức PartialView như thế này

PartialView("ProductViewModel", products[0]); 

Nhưng trên trang Tôi không thể nhìn thấy bất kỳ đánh dấu cho logic xác nhận tuy nhiên và không có gì xảy ra nếu có bất kỳ lỗi nào trên trang. Nếu tôi sử dụng chế độ xem một phần này làm mẫu trình chỉnh sửa, nó hoạt động. Bất kỳ trợ giúp nào được đánh giá cao.

Chỉnh sửa: Để cụ thể hơn, tôi có biểu mẫu HTML và tôi muốn thêm đánh dấu vào nó qua cập nhật ajax (nếu người dùng lần nhấp vào nút, tôi muốn thêm đánh dấu mới vào biểu mẫu đó). Nếu tôi bao gồm các điều khiển tĩnh, tôi có nghĩa là nếu tôi hiển thị chúng khi trang được tải, xác thực hoạt động nhưng nếu tôi thêm điều khiển vào biểu mẫu đó bằng cuộc gọi ajax, không có đánh dấu xác thực nào được chèn cho các điều khiển đó. xem một phần của tôi trông như thế này:

@Html.LabelFor(x => x.ProductPrice) 

@Html.TextBoxFor(x => x.ProductPrice) 

@Html.ValidationMessageFor(x => x.ProductPrice) 

dạng của tôi trông như thế này:

@using (Html.BeginForm()) 
{ 
    <div id="div_Products"> 
     @Html.EditorFor(x => x) 
    </div> 

    <input type="submit" value="Compare" /> 
} 

Đoạn mã trên hoạt động tốt, xác nhận hoạt động. Về phía máy chủ tôi gọi một phương pháp hành động trông giống như:

[HttpPost] 
public ActionResult InsertProduct() 
{ 
    var newProductVM = new ProductViewModel{ ProductPrice = 789 }; 

    return PartialView("~/Views/Nutrition/EditorTemplates/ProductViewModel.cshtml", newProductVM); 
} 

tôi đã tìm ra rằng động cơ MVC chèn những đánh dấu xác nhận chỉ khi nó phát hiện ra rằng các điều khiển đang ở trong một điều khiển form. Khi tôi cố gắng cập nhật điều khiển biểu mẫu của tôi thông qua một cuộc gọi ajax, MVC không có cách nào để biết rằng chúng sẽ được đặt bên trong một phần tử biểu mẫu và đó là lý do tại sao nó không phát ra bất kỳ logic xác nhận nào cho chúng.

+0

Có nghĩa là một trình soạn thảo "phát ra" lỗi xác thực và như vậy, và chế độ xem thì không. Chúng tôi có thể xem mã cho chế độ xem của bạn không? – rfmodulator

+0

Vấn đề là MVC chèn đánh dấu xác thực chỉ khi nó thấy rằng các điều khiển nằm bên trong một biểu mẫu. Vấn đề là tôi muốn thêm đánh dấu vào một điều khiển biểu mẫu thông qua cập nhật ajax nhưng theo cách này thì công cụ MVC không biết rằng đánh dấu này sẽ được chèn vào phần tử biểu mẫu và do đó nó không phát ra bất kỳ đánh dấu xác nhận nào. – Zoliqa

+0

Bạn có thể ép buộc nó bằng một số mã Html.ValidationMessageFor(). Như tôi đã nói, hãy cho chúng tôi xem quan điểm của bạn. – rfmodulator

Trả lời

1

Bạn đã bật xác thực không rõ ràng trong web.config hoặc chính chế độ xem?

trong web.config:

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

hoặc mã bên:

HtmlHelper.ClientValidationEnabled = true; 
HtmlHelper.UnobtrusiveJavaScriptEnabled = true; 
+0

Xác thực của anh ấy hoạt động chính xác trong trình chỉnh sửa, vì vậy điều này cho chúng ta biết rằng cấu hình là chính xác. – rfmodulator

2

Trong Xem phần của bạn, thêm này (C#/Razor):

@Html.ValidationMessageFor(model => model.ProductPrice) 
0

Sử dụng xác nhận khách hàng , có thể xác thực lại các phần tử được tải sau khi tải trang. Vì MVC hiện sử dụng xác thực jQuery, nếu bạn đã bật xác thực ứng dụng khách;

jquery validate - validating a field on pageload

Điều này có thể giúp ích cho bạn.

10

Đặt này ở phía trên cùng xem một phần của bạn và bạn sẽ nhận được thông báo xác nhận trả lại vào đầu ra html:

if (this.ViewContext.FormContext == null) 
{ 
    this.ViewContext.FormContext = new FormContext(); 
} 

Nếu bạn đang sử dụng ajax để thêm các trường mẫu bạn có thể kích hoạt các lĩnh vực mới để được thêm vào xác nhận, một khi họ đã được thêm vào DOM/trang sử dụng một cái gì đó như:

$("form").removeData("validator"); 
$("form").removeData("unobtrusiveValidation"); 
$.validator.unobtrusive.parse("form"); 

EDIT/UPDATE (23 FED 2013): tôi vừa mới bị hack các FormContext của một cái nhìn một phần cho lần đầu tiên trong Visual Studio 2012 và có vẻ như với các phiên bản mới nhất của jQuery và Xác thực, vv Tôi không cần phải thêm 3 dòng javascript (ở trên) để xác thực hoạt động động trên ajax, điều này thật tuyệt vời!

+0

Điều này có hiệu quả, nhưng tôi không chắc mình hiểu tại sao. –

+0

@ChrisJackson - tốt, nhìn vào vấn đề hoàn toàn từ một quan điểm hộp đen cấp cao, nó sẽ là công bằng để nói rằng Html.ValidationMessageFor tìm một FormContext không null - thường sẽ được thiết lập bằng cách sử dụng một cái gì đó như sử dụng (Html.BeginForm) {- và nếu nó không tìm thấy nó thì nó không làm phiền hiển thị các thông báo xác thực. Tôi đoán là việc xác thực JS yêu cầu một biểu mẫu để hoạt động chính xác, do đó không có điểm nào có thông báo xác thực. IMO đó là sự giám sát của nhóm .Net. – Rob

+1

@Rob, cảm ơn, điều này đã chữa khỏi cơn đau đầu của tôi! – Netricity

2

Không chắc nếu điều này vẫn còn là một vấn đề cho bạn, nhưng các giải pháp sẽ được gọi:

$.validator.unobtrusive.parse($('#your-new-form-div')); 

sau khi bạn đã tải đánh dấu hình thức/điều khiển thông qua AJAX. Điều này phân tích các phần tử biểu mẫu mới của bạn và tạo xác thực ứng dụng khách mà bạn đã chỉ định trong chế độ xem của mình.

+0

Bất kể việc đó có phải là vấn đề đối với anh hay không, đó là vấn đề đối với tôi. Tôi đã bouncing xung quanh chiều sâu của interwebz tất cả các freaking buổi chiều tìm kiếm này, biết nó sẽ là một cái gì đó về reapplying xác nhận. Niềm tiếc duy nhất của tôi là tôi có nhưng một người ủng hộ để đưa ra. Cảm ơn bạn, loại sir, như tôi bây giờ có thể dừng chạy nước rút đầu tiên vào bức tường gạch này đã được nhuộm màu với nhiều pint máu của tôi. Ồ, tôi không nói $ ('# my-new-form-div'), tôi đã nói $ ('form') và nó vẫn hoạt động. FYI. – vbullinger

Các vấn đề liên quan