這是一個很明顯的話題,但我一直沒有能夠想出一個解決方案,閱讀以前的職位。希望有人能告訴我這樣做的「正確方法」,因爲我需要做很多工作。Ajax.Beginform後驗證時,Model.State無效觸發器OnSuccess函數
主要問題:當Ajax.Beginform發佈ModelState無效時,它仍會觸發OnSuccess方法。我知道這是正確的行爲,但是我的OnSuccess方法只會在(去圖)帖子「成功」時纔有意義。
在這種情況下,如何最好地管理帶驗證錯誤的重新顯示錶單?如何從我的控制器返回成功= false以及要重新顯示的視圖?
這與問題沒有特別的相關性,但是我在這裏做的事情與試圖在Bootstrap Modal中顯示錶單的方式有些類似,我放棄了這種方式。
1)通過ajax調用控制器以div形式加載表單。
$(function addpaneevent() {
$('.addpane').on("click", function() {
var url = '/QuizPane/QuickPane?quizId=' + $(this).data("quizid");
$.ajax({
url: url,
type: 'GET',
contentType: 'application/json',
success: function (result) {
$('#overlay').html(result);
},
error: function (result) {
console.log("bummer",result);
}
});
});
});
2)返回包含局部視圖形式
public ActionResult QuickPane(int quizId)
{
var model = *querytogetmodel*
return PartialView("QuickPane",model);
}
@using (Ajax.BeginForm("QuickPane", "QuizPane", FormMethod.Post,
new AjaxOptions
{
InsertionMode = InsertionMode.Replace,
HttpMethod = "POST",
OnSuccess = "updatePaneList(data)",
OnFailure = "massivefail(data)",
}))
{
@Html.ValidationSummary(true)
<fieldset>
@Html.HiddenFor(model => model.QuizID)
<div class="editor-label">
@Html.LabelFor(model => model.Title)
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.Title, new { @autofocus = "autofocus" })
@Html.ValidationMessageFor(model => model.Title)
</div>
...more of the same
<input type="submit" value="Create" class="btn btn-primary"/>
</fieldset>
}
3)在提交呼叫交
[HttpPost]
public ActionResult QuickPane(QuizPane quizpane)
{
if (ModelState.IsValid)
{
db.QuizPanes.Add(quizpane);
db.SaveChanges();
return PartialView("_quizpanelist", quizpane);
}
return View(quizpane); //tried a few different things here
}
4)在成功我添加新的記錄到表和除去包含輸入表單的div。
function updatePaneList(data) {
$("#overlay").remove();
var rowcount = $(".expanded #panetable tr:last").count;
$('.expanded #panetable tbody:last').append(data);
};
在這種情況下,不是我失去了模型驗證的所有優點,並附帶消息需要領域等?爲什麼一切都必須如此艱難? :) – Joel
我已成功獲取驗證以顯示部分視圖的唯一方法是將其更改爲完整視圖並將其顯示在iframe中。您可以使用此方法執行客戶端jQuery驗證,並手動執行服務器端驗證,並通過錯誤發送結果,但這有點多。這對我來說也是一個棘手的情況 –
我編輯我的問題,因爲我實際上做返回視圖(quizpane);而不是PartialView。 如果我將UpdateTargetId =「overlay」添加到我的Ajax.BeginForm,它會在ModelState.IsValid == false時正確驗證。但是,當ModelState.IsValid == true時它失敗,因爲它從不調用OnSuccess方法,它只是將結果插入到我不想要的#overlay中。 如果我刪除UpdateTargetId =「overlay」,它將在ModelState.IsValid == true時正常工作,但在ModelState.IsValid == false時失敗,因爲我沒有在窗體中獲取驗證錯誤。 Jeebus! – Joel