之前写过一篇文章Jquery Ajax方法传值到行动,本文是对该文的补充假设控制器中的方法是如下:复制代码代码如下:公共行动结果读取人(人模型模型){ string s=model .ToString();返回内容;}公共行动结果已读人员(ListPersonMoDEL模型){字符串结果=if(模型==null)返回内容(结果);foreach(模型中的var s){ result=s . ToString();结果='-';}返回内容(结果);} 其中PersonModel定义如下:复制代码代码如下:公共类PersonModel { public int id { set得到;}公共字符串名称{集合得到;}公共int age { set得到;}公共弯曲件性别{集合得到;}公共字符串城市{集合得到;}公共重写字符串ToString() { string s=string .格式(@ ' id : { 0 }姓名: { 1 }年龄: { 2 }性别: { 3 }城市3360 { 4 } '、id、姓名、年龄、性别、城市);返回s;} } 那么控制器方法分别接受单个模型和一个模型的名单。采用通过创建交互式、快速动态网页应用的网页开发技术传递参数。对于传递单个参数的情况,假设射流研究…代码如下:复制代码代码如下:var person={ id: '001 ',name: 'zhangsan ',age: '20 ',gender: true,city 3360 ' Shanghai ' };var option={ URL : '/test/read person ',type: 'POST ',data: person,dataType: 'html ',success:函数(结果){ alert(结果);} };$.ajax(选项);从铬中截图可以看到如下
传递的数据是一串形式数据,根据命名匹配的原则,也是可以取得数据的
将选择权的代码改成如下复制代码代码如下: var option={ URL : '/test/read person ',type: 'POST ',data: JSON.stringify(person),dataType: 'html ',success : function(result){ alert(result);} };$.ajax(选项);其中JSON.stringify方法签名为stringify (value [,replacer [,space ] ]),根据ECMA-262标准细长的函数返回的是JSON格式的字符串。它可以有3个参数。摘抄如下:字符串函数返回一个JSON格式的字符串,表示一个ECMAScript值。它可以采用三个参数。第一个参数是必需的。值参数是一个ECMAScript值,它通常是一个对象或数组,尽管它也可以是字符串、布尔值、数字或空值。可选的替代者参数可以是一个改变对象和数组的字符串化方式的函数,也可以是一个字符串和数字的数组,作为选择将被字符串化的对象属性的白名单。可选的空格参数是字符串或数字,它允许在结果中注入空格以提高可读性。默认的ContentType的属性值是应用程序/x-www-form-urlencoded '引自http://www.w3.org/TR/html401/interact/forms.html#adef-enctype看请求头的截图
所以传递给控制器的是一个json字符串,MVC也可以根据命名匹配来获取参数的值。将选项代码更改为以下内容。复制代码如下: var Option={ URL : '/test/read person ',type:' post ',data3360 person,datatype:' html '。content type : ' application/JSON ',success:函数(结果){ alert(结果);} };将contentType更改为json格式,您将获得错误信息。虽然person是一个json对象,但是ajax和jquery中的数据会自动转换为查询字符串格式key1=value1key2=value2。显然,这种格式不是json格式,所以会出错。为了避免转换为查询字符串格式,您只需要将processData设置为fasle。ProcessData默认为true。这里需要注意的是,当指定contentType时,数据将不再以表单数据的形式提交,而是以请求数据的形式提交。您可以从图中的请求标题中看到。需要注意的是,表单数据提交的数据可以通过FormCollection获取。无法通过表单收集获得提交的请求数据。将processData设置为默认值true。
如果processData设置为false。
以上两种方式,根据应用/json的类型,都会失败,因为json是基于文本的格式,以上两种方式都不是json文本。因此,会出现错误。因此,将选项改为:复制代码如下: varoption={ URL : '/test/read person ',type:' post ',data:json.stringfy (person),datatype3360' html ',content type : ' application/JSON ',success 3360 function(result){ alert(result);} };然后传递json文本,这样根据名称匹配,就可以得到值。
对于简单的数据类型,有时可以通过命名匹配来传递值,而无需指定contentType。但是对于稍微复杂一点的数据类型,有时会指定内容类型:' application/JSON ',处理起来比较方便。如果控制器中的操作方法接受一个类型为List的参数,比如公共操作结果read persons(列表人模型),那么js首先构造这样一个json对象数组。以下代码复制如下: varpers=[{ id : ' 001 ',name3360 '樟山',age:' 20 ',gender: true,city: ' Shanghai ' },{id:' 002 ',name: 'lisi ',age: '21 ',gender: false,city 3360 ' Beijing ' }];简单数组作为数据传递,但表单数据不可识别。所以再次将这个数组放入json表单。如下:json的键值使用模型,这样就可以和控制器中的参数名一样,可以匹配。复制的代码如下: varjsonp={ model 3360 persons };var option={ URL : '/test/ReadPersons ',type: 'POST ',data: jsonp,dataType: 'html ',success:函数(结果){ alert(结果);} };由于没有指定contentType,因此它是默认的应用程序/x-www-form-urlencoded。此时,它以表单数据模式传输。。
从截图可以看出。但是,对于这种格式的数据,控制器只能获取指定模型的两个元素,而不能获取元素中的属性值。
如果数据改为JSON.stringify(jsonp),则如下:复制代码如下: varoption={ URL 3360 '/Test/Read Persons ',键入:' Post ',Data :JSON。Stringify (jsonp),dataType: 'html ',success:函数(结果){ alert(结果);} };
那么传递过去的格式数据是一串字符串控制器跟无法识别出这个东西,因此获不到值。如果仅仅设置内容类型: '应用程序/json ',而传递的又不是json格式的数据,如下:那么传递过去的格式数据是一串字符串控制器跟无法识别出这个东西,因此获不到值。如果仅仅设置内容类型: '应用程序/json ',而传递的又不是json格式的数据,如下:复制代码代码如下: var option={ URL : '/test/read pers ',type: 'POST ',data: jsonp,dataType: 'html ',内容类型: ' application/JSON ',success : function(result){ alert(result);} };因为jquery的创建交互式、快速动态网页应用的网页开发技术方法会把数据转换成查询字符串,因此就变成如下的样子。这串文本当然不符合json格式,因此会出现下面的错误
如果设置内容类型: '应用程序/json ',并且设置数据: JSON。瘦长的(人),如下:复制代码代码如下: var option={ URL : '/test/ReadPersons ',type: 'POST ',data : JSON。stringify(persons),dataType: 'html ',内容类型: ' application/JSON ',success :函数(result){ alert(result);} };那么可以获得到真正完整的json数据了
最后,此处再演示一个更复杂的参数类型,以便加深理解。首先看一下控制器中的方法签名,TestClassB和一个TestClassA的名单。稍显复杂。复制代码代码如下:公开行动结果Fortest(测试b类TB,列表测试a类TA){字符串结果=' ';返回内容(结果);} 再看TestClassA和TestClassB,更显复杂。但是结构要清晰的话,也不是很难。复制代码代码如下:公共类TestClassA {公共字符串a1 { set得到;}公共列表字符串a2 { set得到;} }公共类TestClassB {公共字符串b1 { set得到;} public InnerTestClassC ITCC { set;得到;}公共类innertestclass c { public Listint C1 { set;得到;} } } 看射流研究…代码:逐步的构造出一个json格式。复制代码代码如下:美元(' #btn ').点击(function(){ var JSON data={ TB: } },TA:[]};jsondata .TB.b1=' b1jsondata .肺结核。ITCC={ };jsondata .肺结核。ITCC.c1=新阵列(1,2,3,4);var ta1={ };ta1.a1=' a1ta1.a2=新数组(‘a’、‘b’、‘x’、‘y’);var ta2={ };ta2.a1=' a2ta2.a2=新数组(‘a2’、‘B2’、‘x2’);jsondata .ta。push(ta1);jsondata .ta。push(ta2);var option={ URL : '/test/Fortest ',type: 'POST ',data : JSON。stringify(JSON数据),dataType: 'html ',内容类型: ' application/JSON ',success :函数(结果){ alert(结果);} };$.ajax(选项);});最终,发送出去的json字符串如下:{'TB':{'b1':'b1 ',' ITCC':{'c1':[1,2,3,4]},' TA':[{'a1':'a1 ',' a2':['a ',' b ',' x ',' y']},{'a1':'a2 ',' a2':['a2 ',' b2 ',' x2 ']} }控制器接收到这个json串后,就能自动的匹配参数了。具体得到的参数如下截图
总结:1。如果未指定contentType,默认情况下将由application/x-www-form-URL encoded发送。即使此时发送json格式的数据,默认情况下,jquery的ajax会将其转化为查询字符串(可以通过修改ajax参数进行修改)并以FormData的形式发送。2.在未指定contentType的情况下,如果控制器中的方法签名比较简单,甚至可以通过MVC的命名匹配规则来获取FormData形式的数据。3.当contentType被指定为“application/json”时,发送的数据必须是符合json规范的字符串。一般来说,json。stringfy (jsondata)是可读的,可以获得一个JSON字符串。当然没必要。只要符合json规范,就可以发送使用串联的字符串。4.如果contentType为“application/json”,则发送的数据不是符合json规范的字符串,将会出现错误。5.通常尽量将contentType指定为‘application/json’,发送JSON字符串作为发送数据,这样可读性更好,复杂的函数签名也能很好的匹配。本文来自“一个博客”博客。