2011-10-04 25 views
2

我需要一些关于如何编写我的应用程序的AJAX部分的帮助/指导。需要关于MVC中我的AJAX表单的流程的建议

我有一个按钮,点击后会弹出一个模式对话框。在该对话框我有有一个文本框和一个按钮来保存值的Ajax表单:

@using(Ajax.BeginForm("SaveText", new AjaxOptions{ OnSuccess = "ajaxSuccess" })) 
{ 
    @Html.TextBoxFor(m => m.Text) 

    <p> 
     <input type="submit" value="Save" /> 
    </p> 
} 

当AJAX顺利完成我想要关闭对话框,并刷新我的主网页上的网格:

function ajaxSuccess() { 
    closeDialog(); 
    refreshGrid(); 
} 

我试图实施验证时遇到了问题。我不确定如何完成我想要的。这里是我的控制器:

public ActionResult SaveText(SaveTextViewModel model) 
{ 
    if(ModelState.IsValid) 
    { 
     return PartialView("SaveTextPartial", model); 
    } 

    repository.SaveText(...); 

    return PartialView("SaveTextPartial"); 
} 

这里就是我遇到的困难:当我提交表单,并有验证错误,控制器返回的局部视图,但AJAX的onSuccess方法完成。我不知道如何区分错误的成功与没有错误的成功。当我有验证错误时,我的表单关闭,网格刷新,这不是我想要的。

有没有人有任何想法?我是否需要重构AJAX调用的整个流程,还是完全不同?

回答

1

它看起来像你不需要这种形式要在JavaScript(因为你总是传回一个局部视图),所以为什么不成功时传回一个简单的JSON对象呢?

return Json(new { success = true }) 

如果出现错误,则返回部分视图,以便可以替换HTML。

然后在回调测试它...

if (result.success) { } 

这样一来,就成功,你可以放心地关闭对话框但验证错误,你换出对话框的HTML与您收到的HTML在AJAX请求上。

我不知道什么参数可用于您的onSuccess回调,但我确定响应正文是其中之一。

+0

没有意识到我可以在一个路径中返回一个PartialView,而在另一个路径中返回一个JsonReult,并且javascript能够理解它。 – Dismissile

+0

MVC非常棒;)您可以返回所有可以使用jQuery处理的HTML,JSON,XML或纯文本。 – kamranicus

0

你可以在错误的情况下添加自定义HTTP标头:

public ActionResult SaveText(SaveTextViewModel model) 
{ 
    if(!ModelState.IsValid) 
    { 
     // a validation error occurred 
     Response.AppendHeader("X-Error", "true"); 
     return PartialView("SaveTextPartial", model); 
    } 

    repository.SaveText(...); 

    return PartialView("SaveTextPartial"); 
} 

,并在客户端上:

function ajaxSuccess(e, status, xhr) { 
    if (xhr.getResponseHeader('X-ERROR')) { 
     alert('failure'); 
    } else { 
     alert('success'); 
    } 
} 
+0

不是很RESTful。为什么不使用HTTP状态码? – bzlm

+0

@bzlm,因为如果你发送一些200以外的状态码,ajaxSuccess将永远不会被调用。但是这可以通过使用完整的ajax来解决。 –

+0

是的,为什么不呢?即使对于HTTP级别的观察者来说,成功也意味着成功。我会打开“详细的错误消息”以避免IIS高错误错误页面,使用HTTP 500或类似的错误,并在'OnComplete'中刷新网格。 – bzlm