- 时间:2020-01-25 15:10 编辑: 来源: 阅读:
- 扫一扫,手机访问
摘要:再谈Jquery Ajax方法传递到action(补充)
之前写过一篇文章[url=http://www.1sucai.cn/article/50010.htm]Jquery Ajax方法传值到action[/url],本文是对该文的补充
假设 controller中的方法是如下:
[url=http://cnn237111.blog.51cto.com/file:///C:/Users/Administrator/AppData/Local/Temp/WindowsLiveWriter1286139640/supfiles10077468/clipboard[3].png][img]http://files.jb51.net/file_images/article/201405/201405112233292.png[/img]
[/url]
传递的数据是一串Form数据,根据命名匹配的原则,也是可以取得数据的。
[url=http://cnn237111.blog.51cto.com/file:///C:/Users/Administrator/AppData/Local/Temp/WindowsLiveWriter1286139640/supfiles10077468/image[2].png][img]http://files.jb51.net/file_images/article/201405/201405112233293.png[/img]
[/url]
将option 的代码改成如下
[url=http://cnn237111.blog.51cto.com/file:///C:/Users/Administrator/AppData/Local/Temp/WindowsLiveWriter1286139640/supfiles10077468/clipboard[4][2].png][img]http://files.jb51.net/file_images/article/201405/201405112233294.png[/img]
[/url]
因此,传递到controller的是一个json字符串,MVC根据命名匹配也是可以获得到参数的值。
将将option 的代码改成如下
[url=http://cnn237111.blog.51cto.com/file:///C:/Users/Administrator/AppData/Local/Temp/WindowsLiveWriter1286139640/supfiles10077468/image[11].png][img]http://files.jb51.net/file_images/article/201405/201405112233295.png[/img]
[/url]
如果把processData设置为false。
[url=http://cnn237111.blog.51cto.com/file:///C:/Users/Administrator/AppData/Local/Temp/WindowsLiveWriter1286139640/supfiles10077468/image[8].png][img]http://files.jb51.net/file_images/article/201405/201405112233296.png[/img]
[/url]
以上两种方式,按照application/json的类型传给都会失败,因为json是基于文本的格式,上面两种方式传递的都不是json文本。因此会出错。
因此,把option改成:
[url=http://cnn237111.blog.51cto.com/file:///C:/Users/Administrator/AppData/Local/Temp/WindowsLiveWriter1286139640/supfiles10077468/clipboard[8][2].png][img]http://files.jb51.net/file_images/article/201405/201405112233297.png[/img]
[/url]
对于较为简单是数据类型,有时候不指定contentType也能通过命名匹配传值。但是对于稍微复杂点的数据类型,有时指定contentType: 'application/json',处理起来更加方便。
如果一个controller里的action方法是接受一个List类型的参数,比如:
public ActionResult ReadPersons(List<PersonModel> model)
那么js中先构造这样的一个json对象的数组。如下
[url=http://img1.51cto.com/attachment/201209/7/2359144_1346998491QOUm.png][img]http://files.jb51.net/file_images/article/201405/201405112233298.png[/img]
[/url]
可以从截图中看到。但是这种格式的数据,controller中只能获得指定model用2个元素,无法获得元素中属性的值。
[url=http://img1.51cto.com/attachment/201209/7/2359144_1346998492xs0o.png][img]http://files.jb51.net/file_images/article/201405/201405112233299.png[/img]
[/url]
如果把data改成JSON.stringify(jsonp),如下:
[url=http://img1.51cto.com/attachment/201209/7/2359144_1346998492Iuv9.png][img]http://files.jb51.net/file_images/article/201405/2014051122332910.png[/img]
[/url]
那么传递过去的Form Data是一串字符串,controller跟无法识别出这个东西,因此获不到值。如果仅仅设置contentType: 'application/json',而传递的又不是json格式的数据,如下:
那么传递过去的Form Data是一串字符串,controller跟无法识别出这个东西,因此获不到值。如果仅仅设置contentType: 'application/json',而传递的又不是json格式的数据,如下:
[url=http://img1.51cto.com/attachment/201209/7/2359144_1346998496L3yA.png][img]http://files.jb51.net/file_images/article/201405/2014051122332911.png[/img]
[/url]
[url=http://img1.51cto.com/attachment/201209/7/2359144_1346998497ijS1.png][img]http://files.jb51.net/file_images/article/201405/2014051122332912.png[/img]
[/url]
如果设置contentType: 'application/json',并且设置data: JSON.stringify(persons),如下:
[url=http://img1.51cto.com/attachment/201209/7/2359144_1346998501ilyB.png][img]http://files.jb51.net/file_images/article/201405/2014051122332913.png[/img]
[/url]
最后,此处再演示一个更复杂的参数类型,以便加深理解。
首先看一下Controller中的方法签名,TestClassB 和一个TestClassA的List。稍显复杂。
[url=http://img1.51cto.com/attachment/201209/7/2359144_1346998501rFx1.png][img]http://files.jb51.net/file_images/article/201405/2014051122332914.png[/img]
[/url]
[url=http://img1.51cto.com/attachment/201209/7/2359144_1346998502rDZn.png][img]http://files.jb51.net/file_images/article/201405/2014051122332915.png[/img]
[/url]
[b]总结:
[/b]1.不指定contentType的话,默认都是application/x-www-form-urlencoded方式发送。此时即便发送的是json格式的数据,默认情况下,jquery的ajax也会把他转为查询字符串的形式(可以通过修改ajax参数修改),以FormData的形式发送出去。
2.不指定contentType的时候,如果controller中的方法签名比较简单,那么即便是FormData形式的数据也能由MVC的命名匹配规则获取到数据。
3.指定contentType为'application/json'时候,发送的数据必须是符合json规范的字符串。通常,使用 JSON.stringify(jsondata)有较好的可读性,可以获得一个json字符串。当然,不是必须的。使用拼接的字符串,只要是符合json规范的,也是可以发送的。
4.如果contentType为'application/json'时,发送的data不是符合json规范的字符串,则会出错。
5.通常情况下,尽量指定contentType为'application/json',并且发送json字符串作为发送数据,这样可读性更好,并且对于复杂的函数签名,也能起到很好的匹配。
本文出自 “一只博客” 博客
微信版

扫一扫进微信版
返回顶部