Đây là lần theo dõi previous question mà tôi đã có trước đây về việc truyền lại lỗi cho khách hàng, nhưng cũng liên quan đến ModelState.Trong ASP.Net MVC, ModelState có thể được sử dụng với bản cập nhật ajax không?
Có ai thành công sử dụng phương pháp tiếp cận bữa tối Nerd hay không, nhưng với Ajax? Vì vậy, Nerd Dinner thực hiện cập nhật như vậy.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues)
{
Dinner dinner = dinnerRepository.GetDinner(id);
try
{
UpdateModel(dinner);
dinnerRepository.Save();
return RedirectToAction("Details", new { id=dinner.DinnerID });
}
catch
{
foreach (var issue in dinner.GetRuleViolations()) {
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
return View(dinner);
}
}
Sử dụng jQuery $ .ajax
function hijack(form, callback, errorFunction, format) {
$.ajax({
url: form.action,
type: form.method,
dataType: format,
data: $(form).serialize(),
success: callback,
error: function(xhr, textStatus, errorThrown) {
errorFunction(xhr, textStatus, errorThrown);
}
});
}
Ajax, "thử" một phần của bộ điều khiển trở nên
try
{
UpdateModel(dinner);
dinnerRepository.Save();
return PartialView("PartialDetails", new { id=dinner.DinnerID });
}
, nhưng bạn sẽ làm gì về phần bắt?
Một giải pháp xử lý lỗi đơn giản để gửi lại một lỗi sẽ
catch(Exception ex)
{
Response.StatusCode = 500;
return Content("An Error occured.");
//throw ex;
}
, nhưng điều đó không vượt qua qua ModelState mạnh mẽ được xây dựng vào MVC. Tôi đã nghĩ đến một số tùy chọn, nhưng tôi thực sự muốn 2 điều:
- Tôi muốn lỗi được xử lý trong thuộc tính lỗi của jQuery.
- Tôi muốn sử dụng được xây dựng trong logic xác thực ASP.Net MVC càng nhiều càng tốt.
Điều này có khả thi không? Nếu không, lựa chọn thay thế tốt nhất mà bạn biết là gì?
Rất cám ơn.
Cập nhật Tôi chưa đánh dấu câu trả lời này vì tôi chưa triển khai những gì tôi nghĩ sẽ hoạt động tốt nhất.
Tôi đã quyết định rằng tôi không thực sự thích thành công => gửi danh sách làm mới, thất bại => gửi thông báo lỗi mà tôi đang dùng. Tôi đã làm điều này để giảm số lượng cuộc gọi, nhưng danh sách được làm mới thực sự được đặt thành trang. Cố gắng thực hiện cả hai liên kết chặt chẽ popup với trang tổng thể của nó.
Tôi sẽ thêm một sự kiện jQuery tùy chỉnh làm mới danh sách trang chính khi hộp thoại đóng. Về bản chất, đó là mẫu người quan sát. Tôi thích ý tưởng rằng trang nói đến cửa sổ bật lên "cho tôi biết khi nào bạn đã hoàn tất" (còn gọi là đóng), mà không cần phải thông báo lý do bật lên. Nó đòi hỏi một cuộc gọi bổ sung, nhưng tôi không thấy đó là một vấn đề lớn.
Tôi vẫn không chắc chắn mức độ mình thích/không thích xác thực phía máy chủ và tôi đang cân nhắc việc xác thực chỉ phía máy khách. Trong khi xác thực phía máy chủ có vẻ như phân lớp sạch, nó cũng có một số vấn đề, bao gồm:
1) Nó đặt kiểm tra chất lượng ở cuối, thay vì bắt đầu. Một sự tương tự với sản xuất sẽ là một chiếc xe được kiểm tra khi nó đến đại lý, thay vì tại các điểm trong quá trình nó được xây dựng.
2) Nó vi phạm mục đích của Ajax. Ajax không chỉ là về việc gửi các sự kiện không đồng bộ, nó còn chỉ gửi những gì tôi cần và chỉ nhận những gì tôi cần. Gửi trở lại toàn bộ mô hình để cung cấp các chi tiết lỗi dường như không đi với Ajax.Điều tôi đang nghĩ đến là chỉ thực hiện xác thực phía máy khách, nhưng mã máy chủ đó và mô hình chế độ xem tùy chỉnh có thể được sử dụng để cho khách hàng biết cách tự động tạo các quy tắc xác thực đó. Tôi cũng nghi ngờ rằng một ngôn ngữ động như IronRuby hoặc IronPython có thể cung cấp một cách thanh lịch hơn để giải quyết những vấn đề này, nhưng có thể lâu hơn một chút trước khi tôi nhìn vào khả năng đó.
tôi cũng nghĩ rằng nó thực sự phụ thuộc vào kịch bản, nếu làm 2 yêu cầu không phải là một vấn đề tôi sẽ đi cho điều đó.Cá nhân làm rất nhiều xác nhận với JavaScript ở phía khách hàng không phải là thứ mà tôi yêu (tôi không biết tại sao, nhưng tôi thấy js giống như một thứ không đáng tin cậy/an toàn/thực hiện đều đặn (trong jquery này tiết kiệm trong ngày)), đặc biệt bởi vì đôi khi bạn không thể thực hiện tất cả các xác thực trên phía máy khách, bạn phải sử dụng một số loại kiểm tra bên, như (thực thể này đã tồn tại trong DB?) và hỗ trợ các ứng dụng khách đã tắt, nhưng như tôi đã nói lúc đầu phụ thuộc vào kịch bản. – JOBG
Tôi đồng ý rằng bạn không thể thực hiện tất cả xác thực ở phía máy khách, có vẻ như khung xác thực có vẻ hướng chủ yếu vào các lỗi trường (quá dài, không phải ngày, v.v ...). Ít nhất trong các ví dụ mà tôi đã nhìn thấy. Khi bạn kiểm tra đầu vào của người dùng, Javascript có vẻ là nơi thích hợp để thực hiện việc kiểm tra. – John
Tôi đã củng cố quyết định của mình về việc thực hiện 2 cuộc gọi, thay vì một, bởi vì nó tách các chi tiết một phần xem từ chế độ xem trang bên dưới nó. Tôi muốn cửa sổ bật lên nói lại chế độ xem trang "Tôi đã đóng" nhưng không biết bất kỳ điều gì về lượt xem trang sẽ thực hiện. jQuery nên làm cho điều đó có thể mà không cần nhiều nỗ lực. Điều đó cho phép tôi không lo lắng rằng những thay đổi đối với chi tiết từng phần của tôi sẽ ảnh hưởng đến trang và ngược lại. – John