2011-09-07 22 views
13

Tôi có biểu mẫu "gửi phản hồi" sử dụng "Ajax.BeginForm" để hiển thị một phần chứa các phần tử biểu mẫu. Sự kiện OnSuccess đang kích hoạt ngay cả khi ModelState không hợp lệ. Điều này có bình thường không? Tôi đã mong đợi để có thể làm một vài postbacks dẫn đến một mô hình không hợp lệ, sau đó khi mô hình là hợp lệ và không có lỗi thì sự kiện OnSuccess sẽ kích hoạt?ASP.NET MVC "Ajax.BeginForm" thực thi OnSuccess mặc dù mô hình không hợp lệ

+0

Tôi đồng ý rằng đây là phức tạp vô để làm việc với. Chúng tôi rõ ràng cần một giá trị đơn giản cho biết liệu mô hình có hợp lệ hay không. –

Trả lời

17

Điều này có bình thường không?

Vâng, tất nhiên. Nếu máy chủ gửi HTTP 200, phương thức OnSuccess được gọi. Khái niệm về tính hợp lệ của mô hình tuyến tính chỉ ở phía máy chủ. Miễn là hành động điều khiển của bạn trả về một số view/partial/json/... thì OnSuccess sẽ kích hoạt. Nếu một ngoại lệ được ném vào bên trong hành động điều khiển của bạn thì OnError sẽ được kích hoạt thay vì OnSuccess.

Vì vậy, để xử lý trường hợp này bạn có thể có hành động điều khiển của bạn làm điều gì đó dọc theo dòng:

[HttpPost] 
public ActionResult Process(MyViewModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     return Json(new { success = false }); 
    } 
    return Json(new { success = true }); 
} 

và sau đó:

function success(result) { 
    if (result.success) { 
     // the model was valid 
    } else { 
     // the model was invalid 
    } 
} 

Bây giờ trong trường hợp của mô hình hợp lệ có lẽ bạn muốn hiển thị thông báo lỗi cho người dùng bằng cách làm mới biểu mẫu. Những gì bạn có thể làm trong trường hợp này là đặt biểu mẫu của bạn bên trong một phần và trong trường hợp của một mô hình không hợp lệ, bạn sẽ trả về một phần từ hành động điều khiển của bạn và trong trường hợp thành công một đối tượng json. Vì vậy, trong xử lý thành công của bạn, bạn có thể kiểm tra:

function success(result) { 
    if (result.success) { 
     // the model was valid 
    } else { 
     // there were errors => show them 
     $('#myform_container').html(result); 
     // if you are using client side validation you might also need 
     // to take a look at the following article 
     // http://weblogs.asp.net/imranbaloch/archive/2011/03/05/unobtrusive-client-side-validation-with-dynamic-contents-in-asp-net-mvc.aspx 
     // and reattach the client validators to the form as you are 
     // refreshing its DOM contents here 
    } 
} 
+4

Cảm ơn bạn. Câu trả lời này là hoàn hảo. Tôi ngạc nhiên không có một tài liệu vững chắc về xử lý kịch bản này (lỗi mô hình) với các công cụ AJAX kín đáo. –

+1

Không làm việc cho tôi bởi vì, về thất bại, tôi phải trả lại một khung nhìn, không phải là một JSON. – Misi

+0

Tôi nghĩ trước tiên bạn phải kiểm tra loại kết quả: if (typeof (result) == "object" && result.success) { – Misi

25

tôi xử lý vấn đề này với một kỹ thuật javascript khá đơn giản:

Đầu tiên thiết lập OnSuccess của bạn như thế này:

OnSuccess = "UpdateSuccessful(data)" 

Sau đó, chức năng javascript của bạn như này:

function UpdateSuccessful(data) { 
    if (data.indexOf("field-validation-error") > -1) return; 

    // Do your valid stuff here 
} 

Bằng cách này, không cần phải làm phiền w thứ i điều khiển của bạn, hoặc quan trọng hơn, điều khiển của bạn có thể trả lại Partial View với các lỗi mô hình mà không làm bất cứ điều gì lạ, ví dụ:

public ActionResult SaveDetails(Project model) 
    { 
     if (ModelState.IsValid) 
     { 
      model.SaveProject(); 
     } 

     return PartialView("ProjectForm", model); 
    } 

Và trong AjaxOptions của bạn:

UpdateTargetId = "FormContents" 

Bây giờ chỉ cần chắc chắn rằng bạn có số div hoặc thứ gì đó có id="FormContents" ở bất cứ nơi nào bạn muốn biểu mẫu của mình được hiển thị.

+1

'OnSuccess =" UpdateSuccessful (data) "': thực sự hữu ích. cảm ơn. –

+0

Đối tượng ** dữ liệu này có hoạt động trên tất cả các trình duyệt không? nó có bất kỳ hạn chế hoặc vấn đề tương thích nào cả? –

+0

Điều này sẽ hoạt động trên tất cả các trình duyệt đã bật JavaScript. –

3

Bạn có thể làm như sau:

var OnSuccess = function() { 
    if ($(".validation-summary-errors").length == 0) { 
     //Your javascript/jquery code goes here 
    } 
} 
1

biến thể nhẹ vào Luis' câu trả lời:

function OnSuccess() { 
    if ($("span[class='field-validation-error']").length == 0) { 
     alert("Target Platform saved Successfully."); 
    } 
} 
Các vấn đề liên quan