本文为大家介绍下使用javaScript解决asp
net中mvc使用ajax提交参数的匹配问题
遇到类似情况的朋友可以参考下
希望对大家有所帮助想到在asp
net的mvc中如果使用ajax向服务端传递参数时如果参数是一个类或者是个数组(或List集合)以及更复杂的对象时
服务端总是会发 生取不到值的情况
当然网上也有很多解决的例子
但都是在服务端想办法来解决的(比如将json转换为字符串
再在服务端反序列化为一个对象)
为何不能 在客户端就把这个问题搞定
其实问题没那么复杂
那是因为在jquery提交Array的数据时
提交的时候始终会在名称后面加上” []”
问题就出在这里
另外在服务端对数组和内嵌的js对象进行解析时
需要像这样的格式
比如数组(或List集合)在服务端需要这样 {
xxx[
]
:
aaa
xxx[
]
:
bbb
}的格式
而内嵌对象需要像这样 {
xxx
a
:
ddd
xxx
b
:
hhh
}
找到问题的原因就好解决了
如果我们能将json的格式转换为服务端了能够识别的格式
问 题岂不迎刃而解
说干就干
直接上代码
复制代码 代码如下:
//用于MVC参数适配JavaScript闭包函数
/*
使用方式如下
$
ajax({
url: "@Url
Action("AjaxTest")"
data: mvcParamMatch(""
sendData)
//在此转换json格式
用于mvc参数提交
dataType: "json"
type: "post"
success:function(result) {
alert(result
Message);
}
});
*/
var mvcParamMatch = (function () {
var MvcParameterAdaptive = {};
//验证是否为数组
MvcParameterAdaptive
isArray = Function
isArray || function (o) {
return typeof o === "object" &&
Object
prototype
toString
call(o) === "[object Array]";
};
//将数组转换为对象
MvcParameterAdaptive
convertArrayToObject = function (/*数组名*/arrName
/*待转换的数组*/array
/*转换后存放的对象
不用输入*/saveOjb) {
var obj = saveOjb || {};
function func(name
arr) {
for (var i in arr) {
if (!MvcParameterAdaptive
isArray(arr[i]) && typeof arr[i] === "object") {
for (var j in arr[i]) {
if (MvcParameterAdaptive
isArray(arr[i][j])) {
func(name + "[" + i + "]
" + j
arr[i][j]);
} else if (typeof arr[i][j] === "object") {
MvcParameterAdaptive
convertObject(name + "[" + i + "]
" + j + "
"
arr[i][j]
obj);
} else {
obj[name + "[" + i + "]
" + j] = arr[i][j];
}
}
} else {
obj[name + "[" + i + "]"] = arr[i];
}
}
}
func(arrName
array);
return obj;
};
//转换对象
MvcParameterAdaptive
convertObject = function (/*对象名*/objName
/*待转换的对象*/turnObj
/*转换后存放的对象
不用输入*/saveOjb) {
var obj = saveOjb || {};
function func(name
tobj) {
for (var i in tobj) {
if (MvcParameterAdaptive
isArray(tobj[i])) {
MvcParameterAdaptive
convertArrayToObject(i
tobj[i]
obj);
} else if (typeof tobj[i] === "object") {
func(name + i + "
"
tobj[i]);
} else {
obj[name + i] = tobj[i];
}
}
}
func(objName
turnObj);
return obj;
};
return function (json
arrName) {
arrName = arrName || "";
if (typeof json !== "object") throw new Error("请传入json对象");
if (MvcParameterAdaptive
isArray(json) && !arrName) throw new Error("请指定数组名
对应Action中数组参数名称!");
if (MvcParameterAdaptive
isArray(json)) {
return MvcParameterAdaptive
convertArrayToObject(arrName
json);
}
return MvcParameterAdaptive
convertObject(""
json);
};
})();
使用方法非常简单
看下面的例子
首先是客户端的代码
复制代码 代码如下:
var sendData = {
"Comment": "qqq"
"Ajax
": { "Name": "sq"
"Age":
"Ajax
S": { "Ajax
Num":
} }
"Ajax
S": [{ "Note": "aaa"
"Num":
"Ajax
S": [{ "Name": "sq
"
"Age":
"Ajax
S": { "Ajax
Num":
} }
{ "Name": "sq
"
"Age":
"Ajax
S": { "Ajax
Num":
} }] }
{ "Note": "bbb"
"Num":
"Ajax
S": [{ "Name": "sq
"
"Age":
"Ajax
S": { "Ajax
Num":
} }
{ "Name": "sq
"
"Age":
}] }]
};
$
ajax({
url: "@Url
Action("AjaxTest")"
/*
在此使用闭包函数转换json对象
如果你的json对象自身就是个数组Array
那么需要指定一个名称
这个名称对应于Action中这个数组参数的名称像这样
data:mvcParamMatch(sendData
"Action中所对应的参数名称")
*/
data: mvcParamMatch(sendData)
dataType: "json"
type: "post"
success:function(result) {
alert(result
Message);
}
error:function(a
b
c) {
}
});
然后是服务端对应客户端json的实体类
复制代码 代码如下:
public class AjaxParamModels
{
public string Comment { set; get; }
public Ajax
Ajax
{ set; get; }
public List<Ajax
> Ajax
S { set; get; }
}
public class Ajax
{
public string Name { set; get; }
public int Age { set; get; }
public Ajax
Ajax
S { set; get; }
}
public class Ajax
{
public string Note { set; get; }
public int Num { set; get; }
public List<Ajax
> Ajax
S { set; get; }
}
public class Ajax
{
public int Ajax
Num { set; get; }
}
然后是controller中的action代码
复制代码 代码如下:
public class TestController : Controller
{
//
// GET: /Test/
public ActionResult Index()
{
return View();
}
public ActionResult AjaxTest(Models
AjaxParamModels model)
{
//在此可访问model
return Json(new {Message = "qqqqq"});
}
}
这样就OK了
不管你这个json对象有多少复杂都没关系
他会自动转换为服务端要求的格式
服务端再也不用操心了