如何解决正确的方式在ASP.Net MVC 3中处理Ajax调用
|| 在ASP.Net MVC中对Ajax调用进行编码时,除了发出调用,在服务器上处理它们以及处理客户端的成功与失败之外,我们还有很多选择。有些事情显然有正确的答案,但我一直找不到清晰的指导。那么,端到端进行ajax调用的正确方法是什么? 包含 将用于URL的操作的URL注入到Ajax调用中的最佳方法是什么? 选择JsonBehavior时有哪些注意事项? 在服务器端处理错误的最佳方法是什么? 客户端error()回调是由任何错误(即意外的OutOfMemoryException)触发,还是仅由可预见的错误(即无效输入)触发? 以会触发error()回调的方式导出错误的最佳方法是什么。 确保错误回调获得正确状态代码和响应文本的最佳方法。 验证错误应导致错误StatusCode还是应作为响应验证对象的一部分。 在客户端处理错误的最佳方法是什么? 是否应该以与验证摘要类似的方式在服务器端显示意外错误?也许只是一个“出了一些问题”对话框?客户是否应该能够区分两者? 人们还有其他强烈意见吗?解决方法
问题/答案风格
将动作的URL注入Ajax调用的最佳方法是什么?
关于这没有约定,这在很大程度上还取决于如何将您的内容带给客户端。是通过视图/局部视图(在这种情况下,您可以使用
Html
/Url
辅助方法生成URL,还是仅在客户端上生成(模板等)。通常,我们只希望一些常规HTML元素扩展Ajax行为(例如表单,按钮和链接)。在这种情况下,最好提供正确的URL,我们也可以从中读取它们并在脚本中使用它们(例如链接中的href
)。让用户更清楚地知道事情的指向。我们是否将它们转换为GET / POST / DELETE / PUT请求不再重要,我建议避免在脚本中对URL进行硬编码,因为您可能会更改路由或提供其他处理方式。尽可能使用By0ѭ助手是维护的一种更好的方法。在将URL添加到不自动支持它们的元素(无href
或src
属性)时,您始终可以将其添加为自定义属性特别是当您使用数据属性(例如data-href
或类似属性)时。 d John Resig的博客文章。
选择JsonBehavior时有哪些注意事项?
最好在必须返回Json时发出POST请求。在GET请求中,您必须了解JSON劫持的潜在影响,这也是必须明确指定允许带JSON结果的get请求的原因。
在服务器端处理错误的最佳方法是什么?
处理服务器错误(不能也不应抑制)的最好方法是将错误告知用户。它的细节通常并不重要,因为用户并不精通开发,但是告诉他们出了问题是可以的。特别是如果您可以为他们提供某种解决方案。通过Ajax调用,押注将错误返回为可以使用错误处理程序Javascript函数处理的错误。我写了一篇博客文章,详细介绍了整个过程,并提供了显示如何正确处理验证错误的代码。我个人认为将错误归为成功是错误的。因此我没有。但这是有争议的。我使用的代码大大简化了控制器的操作:
[HandleModelStateException]
public ActionResult AddUser(User user)
{
if (!this.ModelState.IsValid)
{
throw new ModelStateException(this.ModelState);
}
// process valid data
}
客户端error()回调是由任何错误(即意外的OutOfMemoryException
)触发,还是仅由可预见的错误(即无效输入)触发?
如前所述,当用户从启动时获得意外结果时,应将错误报告给用户。不要压制应该报告给他们的错误。但是,不要太详细。内存不足异常有点复杂,无法解释普通的计算机用户。报告一些人类友好且简短的内容。
以触发error()
回调的方式导出错误的最佳方法是什么。
查看我的博客文章并检查代码,以了解如何创建由error()
函数处理的错误
确保错误回调获得正确状态代码和响应文本的最佳方法。
同一篇博客文章
验证错误应导致错误“ 11”,还是应作为响应验证对象的一部分。
验证错误实际上是本质上的警告,应该这样对待。这就是为什么您可以在某些网站上看到肯定的表单验证模式的原因,这些模式还会报告数据何时有效,而不仅仅是通知用户他们犯了另一个错误。验证错误通常是由于无效的用户界面体验和信息不足所致。
在客户端处理错误的最佳方法是什么?
这在很大程度上取决于您的应用程序,但是我建议您遵循行之有效的模式,因为用户很可能会知道练习,并且不会混淆它们。为什么您认为OpenOffice使用与Microsoft Office几乎相同的UI?因为用户知道它是如何工作的,所以它更容易快速,轻松地熟悉该应用程序。但是,如果可以,请不要将用户视为愚蠢的人。使用肯定验证。一些错误也应显示为错误。哦。顺便说一句。我在我的应用程序中使用了不引人注目的信息,其中向用户报告了成功操作之类的信息,但不会干扰他们的工作。一段时间后它会自动消失。与GMail相似。它只是通知您已发送邮件,该信息不需要任何确认。
jQueryajax()
functin支持成功和错误功能,因此最好同时使用。再次:成功返回错误是不正确的。我们根本不需要错误函数。我的HandleModelState操作筛选器返回的错误包括可以使用的特定400错误代码及其结果。
$.ajax({
url: $(this).attr(\"href\"),data: someDataObj,type: \"POST\",success: function(data){
// process data
},error: function(xhr,status,err){
if (xhr.status = 400) {
// handle my error in xhr.resposeText
}
else {
// handle other errors that are cause by unknown processing
}
}
});
是否应该以与验证摘要类似的方式在服务器端显示意外错误?也许只是一个“出了一些问题”对话框?客户是否应该能够区分两者?
人们不喜欢红色的大警报。如果某些内容本质上是警告,则应将其视为比导致您的应用正常运行的实际错误更友好的对待方式。验证尤其应该非常友好。错误应由用户确认,警告可能不应该。取决于它们的性质。但是,如果应该这样做,则可能是错误。
我希望这可以为您清除一些东西。
,将用于URL的操作的URL注入到Ajax调用中的最佳方法是什么?
我个人在AJAXify的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请求,因此您可能需要在客户端上指定“ 16”。哦,当然还有Json的服务器上的AllowGet。
在服务器端处理错误的最佳方法是什么?
我个人使用FluentValidation.NET处理视图模型上的验证错误。服务层也可能存在错误。
在客户端处理错误的最佳方法是什么?
如果服务器返回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。
,这是我在最近的一些项目中的工作方式:
1)我用Url.Action调用在视图中注入ajax URL。
2)Jqgrid使用GET来获取网格数据,因此在填充网格控制器操作中,我需要在Json方法调用中使用JsonRequestBehavior.AllowGet开关。
3)我最近切换到Microsoft的不打扰的客户端验证,它具有简洁的ModelState.IsValid方法,您可以在控制器操作中运行服务器端,以确保没有代码的服务器端也可以运行相同的确切验证复制。用jquery.maskedinput对其进行了网格划分等工作,以掩盖/取消掩盖数据,这是有关如何使所有这些起作用的文章。
4)关于显示错误客户端,这是一个设计问题,必须由涉众来充实。就个人而言,我不喜欢文本框旁边的验证或页面顶部的验证摘要。我更喜欢这些错误在您面前浮出水面,因此我对Microsoft的jquery.validate.unobtrusive.js进行了调整,以在弹出模式对话框中显示该错误。您可以在jquery.validate.unobtrusive.MOD.js文件中看到上述解决方案中的代码(注意,我的版本后缀为\“。mod.js \”),并且可以在Site.Master中看到错误对话框。 。
控制器动作示例:
[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);
}
希望这可以帮助,
罗伯特
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。