Geo*_*uer 14 ajax jquery asp.net-mvc-3
在ASP.Net MVC中编写Ajax调用时,就发出调用,在服务器上处理它们以及处理客户端上的成功和失败而言,我们有很多选择.有些事情显然有正确的答案,但我一直无法找到明确的指导.那么,端到端,进行ajax调用的正确方法是什么?
包含
人们对此有何看法?
Rob*_*nik 21
将URL操作的URL注入Ajax调用的最佳方法是什么?
没有关于此的约定,这在很大程度上取决于您的内容如何被带到客户端.是通过视图/部分视图(在这种情况下,您可以使用Html/ Urlhelper方法生成URL,或者它是纯粹在客户端生成的网址(模板等).我们只是想要一些通常的HTML元素来扩展Ajax行为(我们很常见)在这种情况下,最好提供正确的URL,我们也可以从中读取它们并在我们的脚本中使用它们(比如href在链接中).对于用户指向的内容,它也更清楚.是否我们将它们转换为GET/POST/DELETE/PUT请求并不重要.我建议避免在脚本中使用硬编码URL,因为您可能会更改路由或提供其他处理方法.Html尽可能使用帮助程序更好的维护方式.将URL添加到不自动支持的元素(无href或src属性)时,您可以随时将它们添加为自定义属性,尤其是在使用数据属性(如data-href或类似)时.阅读John Resig的博客文章关于这些.
选择JsonBehavior时有哪些注意事项?
当你必须返回Json时,最好发出POST请求.在GET请求中,您必须了解JSON Hijacking可能带来的影响,这也是您必须明确指定允许使用JSON结果获取请求的原因.
在服务器端处理错误的最佳方法是什么?
处理服务器错误(不能也不应该被抑制)的最佳方法是实际通知用户错误.它的细节通常并不重要,因为用户不是精通开发人员,但告诉他们出了问题是可以的.特别是如果你能为他们提供某种解决方案.并且使用Ajax调用它可以将错误返回为可以使用错误处理程序Javascript函数处理的错误.我写了一篇博文,详细介绍了整个过程,并提供了显示如何正确处理验证错误的代码.我个人认为将错误视为成功是错误的.因此,我没有.但这是有争议的.我使用的代码相当简化了我的控制器操作:
[HandleModelStateException]
public ActionResult AddUser(User user)
{
if (!this.ModelState.IsValid)
{
throw new ModelStateException(this.ModelState);
}
// process valid data
}
Run Code Online (Sandbox Code Playgroud)
客户端error()回调是由任何错误(即意外OutOfMemoryException)触发,还是仅由可预见的错误(即无效输入)触发?
如前所述,当用户从他们发起的内容中获得意外结果时,应向用户报告错误.不要压制应该向他们报告的错误.但是不要过多细节.内存不足异常有点太复杂,无法解释通常的计算机用户.报告一些人性化和简短的事情.
error()以触发回调的方式导出错误的最佳方法是什么.
查看我的博客文章并检查代码,了解如何创建由error()函数处理的错误
确保错误回调的最佳方法是获取正确的状态代码和响应文本.
相同的博文
验证错误是否会导致错误,StatusCode或者它们是否应成为响应验证对象的一部分.
验证错误本质上是警告,应该这样对待.这就是为什么你可以在某些网站上看到积极的表单验证模式,这些模式也会在数据有效时报告,而不是仅告知用户他们已经犯了另一个错误.验证错误通常源于无效的用户界面体验和信息不足.
在客户端处理错误的最佳方法是什么?
这在很大程度上取决于您的应用程序,但我建议您遵循经过验证的模式,因为用户可能会知道演练并且不会混淆它们.为什么您认为OpenOffice使用与Microsoft Office几乎相同的UI?因为用户知道它是如何工作的,所以它更有可能快速,轻松地熟悉应用程序.但如果可以,请不要将用户视为愚蠢的人.使用肯定验证.某些错误也应显示为错误.哦.顺便说一句.我在我的应用程序中使用不显眼的信息,其中向用户报告成功操作等信息但不干扰他们的工作.它会在一段时间后自动消失.与GMail的相似.它只是通知您已发送邮件,此信息不需要任何确认.
jQuery ajax()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
}
}
});
Run Code Online (Sandbox Code Playgroud)
是否应以与验证摘要类似的方式显示服务器端的意外错误?也许只是一个" 错误的东西 "对话框?客户应该能够区分这两者吗?
人们不喜欢大红色警报.如果某些内容本质上是警告,则应该比实际错误更友好地处理,这会阻止您的应用正常工作.特别是验证应该非常友好.错误应该由用户确认,警告可能不应该.取决于他们的性质.但如果他们应该那么他们可能就是错误.
我希望这能为你解决一些问题.
将url的动作url注入ajax调用的最佳方法是什么?
就个人而言,我在DOM元素上使用HTML5 data-*属性,这是我AJAX化的.例如:
<div id="foo" data-url="@Url.Action("foo")">Foo Bar</div>
Run Code Online (Sandbox Code Playgroud)
然后:
$('#foo').click(function() {
var url = $(this).data('url');
// TODO: perform the AJAX call
});
Run Code Online (Sandbox Code Playgroud)
当然,如果DOM元素表示锚或表单,我将使用本机属性(action或href).
选择JsonBehavior时有哪些注意事项?
没有具体考虑.请记住,客户端浏览器可能会缓存GET请求,因此您可能需要{ cache: false }在客户端上进行指定.哦,当然还有Jason服务器上的AllowGet.
在服务器端处理错误的最佳方法是什么?
我个人使用FluentValidation.NET来处理我的视图模型上的验证错误.也可能存在来自服务层的错误.
在客户端处理错误的最佳方法是什么?
如果服务器返回JSON,我通常有一个看起来如下的结构:
{ error = 'some error message', result: null }
Run Code Online (Sandbox Code Playgroud)
要么:
{ error = null, result: { foo: 'bar' } }
Run Code Online (Sandbox Code Playgroud)
取决于是否有错误,并在客户端:
success: function(data) {
if (data.error != null && data.error != '') {
// error
} else {
// use data.result
}
}
Run Code Online (Sandbox Code Playgroud)
我使用error回调来处理服务器上未处理的异常,在这种情况下只显示一些通用的错误消息.可以使用指定全局错误处理程序$.ajaxSetup.
为了简化在服务器上生成这些JSON结果并干掉我的操作,我使用自定义操作过滤器来测试请求是否是AJAX请求,以及是否是AJAX请求测试是否有添加到ModelState的验证错误以及是否用自定义错误JsonResult替换动作结果以处理错误情况.