这显然是一个老生常谈的话题,但仔细阅读以前的帖子,我无法想出一个解决方案。希望有人能告诉我这样做的“正确方法”,因为我需要做很多事情。
主要问题:当 Ajax.Beginform post ModelState 无效时,仍然会触发 OnSuccess 方法。我知道这是正确的行为,但我的 OnSuccess 方法仅在(去图)发布“成功”时才有意义。
在这种情况下,如何最好地管理带有验证错误的重新显示表单?如何从控制器返回 success=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);
};