文栏 - 信息技术 - 浏览文章 - ASP.Net MCV 1.0 在Controller的Action Method中接收客户端发送的JSON对象
ASP.Net MCV 1.0 在Controller的Action Method中接收客户端发送的JSON对象
发布时间: 2010/1/24 18:28:12 作者: 素素 出处: 本站发布

本文首发:http://www.linjialiang.net/
原始链接:
http://www.linjialiang.net/article/view.asp?id=122
作者: 素还真
转载请保留以上信息和本行

 

我们在复杂数据绑定时会用到将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都加上标签。

 
所属分类: 信息技术   所属专题: 原创
共有 28364 人次浏览

icon icon
朋友2012/4/6 16:43:52 认为:
道友啊,能不能弄个实例啥的啊。我初学者。
icon icon
朋友2010/7/19 21:02:41 认为:
太感谢了
icon icon
baobao2010/2/22 23:25:17 认为:
upupupup~~
评论作者:
电子邮件:
评论内容:
投票评价:
验 证 码:
图片包含4个随机字符,点击刷新
请输入上面图片中的随机字符