• 动态类型dynamic(ExpandoObject)


    ExpandoObject作为ViewModel给view传值

    Action

    public ActionResult Index(string id)
            {
                dynamic d = new ExpandoObject();
                d.id = id;
                d.name = "张三";
                return View(d);
            }

    View

    @model dynamic
    <div>
    id=@Model.id
    name=@Model.name
    </div>
    ExpandoObject转换为json

    1、直接转换json,格式不是我们想要的
    public ActionResult Test(string id)
            {
                dynamic d = new ExpandoObject();
                d.id = id;
                d.name = "张三";
                return Json(d, JsonRequestBehavior.AllowGet);
    //结果:[{"Key":"id","Value":"123"},{"Key":"name","Value":"张三"}]
            }

    2、转换成IDictionary<string, object>,然后再转换为json就好了

    public ActionResult Test(string id)
            {
                dynamic d = new ExpandoObject();
                d.id = id;
                d.name = "张三";
    
                var di = d as IDictionary<string, object>;
                di = di.ToDictionary(x => x.Key, x => x.Value);
                return Json(di, JsonRequestBehavior.AllowGet);
            }
    //结果{"id":"123","name":"张三"}

    3、另一种方法JSON.NET

    public ActionResult Test(string id)
            {
                dynamic d = new ExpandoObject();
                d.id = id;
                d.name = "张三";
                var json = JsonConvert.SerializeObject(d);
                return Content(json, "application/json");
    //结果正常:{"id":"123","name":"张三"}
     }

    扩展方法

    /// <summary>
            /// 对象转成可以扩充的匿名对象
            /// </summary>
            /// <param name="obj"></param>
            /// <returns></returns>
            public static dynamic ConvertToDynamic(object obj)
            {
                //知识点:ExpandoObject继承了IDictionary<String, Object>的接口
                IDictionary<string, object> result = new ExpandoObject();
                foreach (PropertyDescriptor pro in TypeDescriptor.GetProperties(obj.GetType()))
                {
                    result.Add(pro.Name, pro.GetValue(obj));
                }
                return result as ExpandoObject;
                /*
                //=============1、新增属性
                //Product为一个class,默认只有一个属性Name
                Product p1 = new Product();
                p1.Name = "商品名称";
     
                dynamic result = ConvertToDynamic(p1);
                exProd.name1 = "我是新属性1";
                exProd.name2 = "我是新属性2";
                Response.Write(result.Name + "," + result.name1 + "," + result.name2);
    
                //=============2、删除属性
                ((IDictionary<string, object>)result).Remove("Name2"); 
    
                //=============3、枚举出已经存在的成员
                foreach (var pro in (IDictionary<string, Object>)result) 
                { 
                    Console.WriteLine(pro.Key+" "+pro.Value); 
                }
    
                //============4、转换json
                var di = d as IDictionary<string, object>;
                di = di.ToDictionary(x => x.Key, x => x.Value);
                return Json(di, JsonRequestBehavior.AllowGet);
                 */
            }

    //成功一定有方法,失败一定有原因。
  • 相关阅读:
    ORACLE 数据迁移到SQL SEVER2005的问题
    sql server性能分析检测数据库阻塞语句
    经典存储过程
    sql server性能分析查询死锁的sql语句
    sql server性能分析索引使用效率评估
    discuz!X2.5不改代码即可去掉网址后面的forum.php后缀
    discuz!X2.5伪静态设置
    详解ListView
    frameset、frame和iframe的区别
    android中的Context到底该怎么用
  • 原文地址:https://www.cnblogs.com/webapi/p/15342631.html
Copyright © 2020-2023  润新知