這是我之前關於將錯誤傳遞迴客戶端的一個previous question的跟進,但也涉及到ModelState。在ASP.Net MVC中,ModelState可以與ajax更新一起使用嗎?
有沒有人成功地使用了Nerd Dinner方法,但使用Ajax?因此,書呆子晚餐會這樣做。
[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);
}
}
使用jQuery $就
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);
}
});
}
阿賈克斯,控制器的 「試試看」 的部分變成
try
{
UpdateModel(dinner);
dinnerRepository.Save();
return PartialView("PartialDetails", new { id=dinner.DinnerID });
}
,但你會怎麼做對扣部分?
一個簡單的錯誤處理解決方案發回的錯誤會
catch(Exception ex)
{
Response.StatusCode = 500;
return Content("An Error occured.");
//throw ex;
}
,但不會通過內置MVC強勁的ModelState通過。我想到了一些選項,但我真的想要2件事:
- 我想要在jQuery的錯誤屬性中處理錯誤。
- 我想盡可能地使用內置的ASP.Net MVC驗證邏輯。
這可能嗎?如果不是,你知道什麼是最好的選擇?
非常感謝。
更新 我還沒有把這個標記爲答案,因爲我還沒有實現我認爲最好的方法。
我已經決定,我不是真的很喜歡成功=>發送刷新列表,失敗=>發送錯誤消息的方法,我正在採取。我這樣做是爲了減少通話次數,但是刷新的列表確實正在設置到頁面上。試圖將兩者都緊緊地綁定到其整個頁面。
我打算添加一個自定義jQuery事件,當對話框關閉時刷新主頁面列表。實質上,它是觀察者模式。我喜歡頁面對彈出窗口「在完成時告訴我」(又名關閉)的想法,而不必告訴彈出窗口的原因。它確實需要額外的電話,但我不認爲這是一個大問題。
我仍然不確定我喜歡/不喜歡服務器端驗證的效果如何,我正在考慮僅使用客戶端驗證。雖然服務器端驗證看起來像乾淨的分層,但它也有一些問題,其中包括:
1)它將質量檢查放在最後,而不是開始。與製造相類似的是一輛汽車在到達經銷商時進行測試,而不是在製造過程中的各個點。 2)違反了Ajax的意圖。 Ajax不僅僅是發送異步事件,它還關於只發送我需要的內容並僅接收我需要的內容。發送整個模型狀態以提供錯誤細節似乎不適用於Ajax。
什麼,我想這樣做是有客戶端只驗證,但該服務器的代碼和一個自定義的視圖模型可以用來告訴客戶如何動態創建的驗證規則。
我還懷疑IronRuby的像IronPython的或動態語言可以提供一個更優雅的方式來解決這些問題,但也可能是更長一點之前,我考慮這種可能性。
嗯,我認爲這真的取決於場景,如果做2請求不是一個問題,我會去那。個人在客戶端使用JavaScript進行大量驗證並不是我喜歡的東西(我不知道爲什麼,但是我看到的js不像一些非常值得信任/安全/同樣實現的東西(在這個jquery中保存一天)),特別是因爲有時候你不能在客戶端做所有的驗證,你必須使用某種服務器端檢查,比如(這個實體已經存在於數據庫中?),並且支持js禁用的客戶端,但正如我在開始時所說的那樣取決於情況。 – JOBG 2010-01-28 18:17:08
我同意你不能在客戶端做所有的驗證,它看起來像驗證框架似乎主要針對現場錯誤(太長,而不是日期等)。至少在我見過的例子中。當你檢查用戶輸入時,Javascript似乎是檢查的適當位置。 – John 2010-02-17 17:10:59
我已經確定了關於撥打2個電話而不是一個電話的決定,因爲它會從該電話下方的頁面視圖中取消部分視圖的詳細信息。我希望彈出窗口回到頁面視圖「我已關閉」,但不知道頁面視圖將執行什麼操作。 jQuery應該儘可能地做到這一點。這使我不必擔心對細節部分視圖的更改會影響頁面,反之亦然。 – John 2010-02-17 17:20:24