本文首发:http://www.linjialiang.net/
我们在复杂数据绑定时会用到将JSON传值回后台,但一般情况都是在后台返回JSON到前台。以下是一个ASP.Net MVC 1.0前后台互传JSON的实例。 JsonParamFilter.cs:
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization; // 需要引用 System.Runtime.Serialization
using System.Runtime.Serialization.Json; // 需要引用 System.ServiceModel.Web
using System.Web;
using System.Web.Mvc;
///<summary>
///使Action Method可以接收序列化后的JSON对象并转换为强类型参数
///</summary>
public class JsonParamFilter : ActionFilterAttribute
{
///<summary>
///类型名称
///</summary>
public Type TargetType { get; set; }
///<summary>
///类型对应的参数名称
///</summary>
public string Param { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if ((filterContext.HttpContext.Request.ContentType ?? string.Empty).Contains("application/json"))
{
try
{
object o = new DataContractJsonSerializer(TargetType).ReadObject(filterContext.HttpContext.Request.InputStream);
filterContext.ActionParameters[Param] = o;
}
catch { }
}
}
}
Action Method里的使用方法:
[JsonParamFilter(TargetType = typeof(EmployeeInfo), Param = "employeeInfo")]
public ActionResult TestJson(EmployeeInfo employeeInfo)
{
return Json(employeeInfo);
}
实体类定义:
///<summary>
///必须加上[DataContract]和[DataMember]的反序列化标签
///需要添加 System.Runtime.Serialization 的引用和 using System.Runtime.Serialization;
///</summary>
[DataContract]
public class EmployeeInfo
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
[DataMember]
public decimal Salary { get; set; }
}
客户端调用:
<script type="text/javascript">
var employee = new Object();
employee.Name = "素还真";
employee.Age = 25;
employee.Salary = 99999.99;
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "/Home/TestJson/",
data: $.toJSON(employee), // 序列化JSON对象,用了一个叫 jquery-json 的插件
dataType: "json",
success: function(json) {
alert("Name:" + json.Name + ", Age:" + json.Age + ", Salary:" + json.Salary);
}
});
</script>
另外还可以通过ModelBinder的方式使用,好处是不需要每个Action Method都加上标签。 |