我有一个“提交反馈”表单,它使用“Ajax.BeginForm”来呈现包含表单元素的部分。即使ModelState无效,OnSuccess事件也会触发。这是正常的吗?我希望能够做一些回发导致模型无效,然后当模型有效且没有错误时,OnSuccess事件会触发吗?
答案 0 :(得分:28)
我用一个相当简单的javascript技术处理这个问题:
首先像这样设置OnSuccess
:
OnSuccess = "UpdateSuccessful(data)"
然后你的javascript函数如下:
function UpdateSuccessful(data) {
if (data.indexOf("field-validation-error") > -1) return;
// Do your valid stuff here
}
通过这种方式,您无需弄乱控制器,或者更重要的是,您的控制器可以返回Partial View
模型错误,而不会做任何奇怪的事情,即:
public ActionResult SaveDetails(Project model)
{
if (ModelState.IsValid)
{
model.SaveProject();
}
return PartialView("ProjectForm", model);
}
在您的AjaxOptions
:
UpdateTargetId = "FormContents"
现在,只需确保您希望表单显示在div
或id="FormContents"
之内。
答案 1 :(得分:18)
这是正常的吗?
是的,当然。如果服务器发送HTTP 200,则调用OnSuccess方法。 modelstate有效性的概念仅限于服务器端。只要你的控制器动作返回一些view / partial / json / ...... OnSuccess就会触发。如果在控制器操作中抛出异常,则会触发OnError而不是OnSuccess。
因此,为了处理这种情况,您可以让控制器操作执行以下操作:
[HttpPost]
public ActionResult Process(MyViewModel model)
{
if (!ModelState.IsValid)
{
return Json(new { success = false });
}
return Json(new { success = true });
}
然后:
function success(result) {
if (result.success) {
// the model was valid
} else {
// the model was invalid
}
}
现在,对于无效模型,您可能希望通过刷新表单向用户显示错误消息。在这种情况下,您可以做的是将表单放在部分内部,如果模型状态无效,您将从控制器操作返回部分视图,并在成功的情况下返回json对象。所以在你的成功处理程序中你可以测试:
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
}
}
答案 2 :(得分:4)
您可以执行以下操作:
var OnSuccess = function() {
if ($(".validation-summary-errors").length == 0) {
//Your javascript/jquery code goes here
}
}
答案 3 :(得分:1)
路易斯的轻微变化'回答:
function OnSuccess() {
if ($("span[class='field-validation-error']").length == 0) {
alert("Target Platform saved Successfully.");
}
}
答案 4 :(得分:0)
我返回一个错误的请求而不是View,以确保ajax调用返回onfail而不是成功。
在xhr.status文本中,您可以找到错误请求中写入的字符串并正确管理onfail事件。
服务器端:
if (!ModelState.IsValid)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Model not valid");
}
客户端:
$.ajax({
url: '',
method: 'POST'
}).fail(function (xhr) {
alert(xhr.statustext);
});