動態類型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>
[email protected]
[email protected]
</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);
             */
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章