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); */ }