那麼我有一個類似的問題;我想使用jsonp將一個對象數組傳遞給控制器,並且始終將其作爲null接收! (我的意思是,通過GET方法,用回撥功能交叉域)
讓我們假設我有一個複雜的類:SearchCriteria
public class SearchCriteria
{
public string destination {get; set;}
public string destinationTitle { get; set; }
public string departure { get; set; }
public string month { get; set; }
public string nights { get; set; }
public string cruiseline { get; set; }
}
我想SearchCriteria數組傳遞給我的控制器。
我找到了解決方案創建一個屬性:
public class JsonpFilter : ActionFilterAttribute
{
public string Param { get; set; }
public Type JsonDataType { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.ContentType.Contains("application/json"))
{
string inputContent = filterContext.HttpContext.Request.Params[Param];
JavaScriptSerializer serializer = new JavaScriptSerializer();
var result = serializer.Deserialize(inputContent, JsonDataType);
filterContext.ActionParameters[Param] = result;
}
}
}
在控制器:
[JsonpFilter(Param = "criterias", JsonDataType = typeof(SearchCriteria[]))]
public JsonpResult getResultSet(SearchCriteria[] criterias)
{
foreach (SearchCriteria sc in criterias)
{
// TODO (normalize criteria, etc..)
}
return Jsonp(new { content = RenderPartialViewToString("getResults", criterias)});
}
在客戶端腳本時,我調用的方法:
// Populate the Array of objects
var criteria = new Array();
for (var i = 0; i < 4; i++) {
criteria.push({ "destination": $("#DestinationValue" + i).val(),
"departure": $("#PortValue" + i).val(),
"month": $("#Month" + i).val(),
"nights": $("#Nights" + i).val(),
"cruiseline": $("#CruiselineValue" + i).val()});
}
// Call the controller; note i do not specify POST method and I specify "callback" in order to enable jsonp that cross the domain.
$.ajax({
url: "getResultSet?callback=?",
dataType: 'json',
data: {"criterias" : JSON.stringify(criteria)},
contentType: 'application/json; charset=utf-8',
success: function (data) {
// call return from the controller
}
});
我希望這可以幫助某人。
執行跨域AJAX調用的最佳方式是使用代理。 – ahren 2012-07-12 23:55:34