在ASP.Net MVC 3中处理Ajax调用的正确方法

时间:2011-05-23 14:09:43

标签: jquery ajax asp.net-mvc-3

在ASP.Net MVC中编写Ajax调用时,就发出调用,在服务器上处理它们以及处理客户端上的成功和失败而言,我们有很多选择。有些事情显然有正确的答案,但我一直无法找到明确的指导。那么,端到端,进行ajax调用的正确方法是什么?

包括

  • 将网址操作的网址注入ajax调用的最佳方法是什么?
  • 选择JsonBehavior时有哪些注意事项?
  • 处理服务器端错误的最佳方法是什么?
    • 客户端错误()回调是由任何错误(即意外的OutOfMemoryException)触发,还是仅由可预见的错误(即无效输入)触发?
    • 以错误()回调将被触发的方式导出错误的最佳方法是什么。
    • 确保错误回调的最佳方法是获取正确的状态代码和响应文本。
    • 验证错误是否会导致Error StatusCode,或者它们是否应成为响应验证对象的一部分。
  • 在客户端处理错误的最佳方法是什么?
    • 是否应以与验证摘要类似的方式显示服务器端的意外错误?也许只是一个正确的事情 - 错误的'对话?客户应该能够区分这两者吗?

人们对此有何看法?

3 个答案:

答案 0 :(得分:21)

答案 1 :(得分:6)

  

将url操作的url注入ajax调用的最佳方法是什么?

就我个人而言,我在DOM元素上使用HTML5 data- *属性。例如:

<div id="foo" data-url="@Url.Action("foo")">Foo Bar</div>

然后:

$('#foo').click(function() {
    var url = $(this).data('url');
    // TODO: perform the AJAX call
});

当然,如果DOM元素表示锚或表单,我将使用本机属性(action或href)。

  

选择JsonBehavior时有哪些注意事项?

没有具体考虑因素。请记住,客户端浏览器可能会缓存GET请求,因此您可能需要在客户端上指定{ cache: false }。哦,当然还有Jason服务器上的AllowGet。

  

在服务器端处理错误的最佳方法是什么?

我个人使用FluentValidation.NET来处理视图模型上的验证错误。 service layer可能会出现错误。

  

在客户端处理错误的最佳方法是什么?

如果服务器返回JSON,我通常有一个看起来如下的结构:

{ error = 'some error message', result: null }

或:

{ error = null, result: { foo: 'bar' } }

取决于是否存在错误,并在客户端上:

success: function(data) {
    if (data.error != null && data.error != '') {
        // error
    } else {
        // use data.result
    }
}

我对服务器上未处理的异常的所有内容使用error回调,在这种情况下只显示一些通用错误消息。可以使用$.ajaxSetup指定全局错误处理程序。

为了简化在服务器上生成这些JSON结果并干掉我的操作,我使用自定义操作过滤器来测试请求是否是AJAX请求,以及是否是AJAX请求测试是否有添加到ModelState的验证错误如果他们用自定义错误JsonResult替换动作结果以处理错误情况。

答案 2 :(得分:0)

以下是我在最近的一些项目中的工作方式:

1)我使用Url.Action调用在视图中注入ajax url。

2)Jqgrid使用GET来获取网格数据,因此在填充网格控制器操作中,我需要在Json方法调用中使用JsonRequestBehavior.AllowGet开关。

3)我最近切换到微软不引人注意的客户端验证,它有一个简洁的ModelState.IsValid方法,您可以在控制器操作中运行服务器端,以确保在服务器端也运行相同的确切验证而无需代码复制。它花了一些工作将它与jquery.maskedinput进行网格划分等等,以掩盖/取消屏蔽数据,here's the article on how to get all that to work

4)关于显示错误客户端,这是一个必须由利益相关者充实的设计问题。就个人而言,我不喜欢文本框旁边的验证或页面顶部的验证摘要。我更喜欢错误跳出你的脸,因此我调整了微软的jquery.validate.unobtrusive.js以在弹出模式对话框中显示错误。您可以在jquery.validate.unobtrusive.MOD.js文件中看到上面解决方案中的代码(请注意我的版本后缀为“.mod.js”),您可以在Site.Master中看到错误对话框。 / p>

控制器操作示例:

[HttpPost]
    public ActionResult Index(PersonalInformation model)
    {
        if (ModelState.IsValid)
        {
            // TODO: sell personal information to sleazeballs

            TempData["PersonalInformation"] = model;

            return RedirectToAction("Success");
        }

        // If we got this far, something failed, redisplay form
        Index_Load();
        return View(model);
    }

希望这有帮助,

罗伯特