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

如何解决正确的方式在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相似。它只是通知您已发送邮件,该信息不需要任何确认。 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
        }
    }
});
是否应该以与验证摘要类似的方式在服务器端显示意外错误?也许只是一个“出了一些问题”对话框?客户是否应该能够区分两者? 人们不喜欢红色的大警报。如果某些内容本质上是警告,则应将其视为比导致您的应用正常运行的实际错误更友好的对待方式。验证尤其应该非常友好。错误应由用户确认,警告可能不应该。取决于它们的性质。但是,如果应该这样做,则可能是错误。 我希望这可以为您清除一些东西。     ,将用于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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res