有如鵬網(wǎng)友問:
? ? 我關(guān)注了如鵬網(wǎng)N多年跺涤,如鵬網(wǎng)的教學(xué)理念和方法非常對我的學(xué)習(xí)方法,相信也對很多人的學(xué)習(xí)方法监透。我是很佩服如鵬網(wǎng)的桶错。
? ? 不多說了,直接說問題吧胀蛮,這個問題困擾我了N多年了沒解決院刁,突然想到是否可以冒昧問一下:
? ? 問題就是:“前臺如何遍歷匿名類集合”绒净?
就是使用.net 的MVC時秒梅,后臺Action里為了減少查詢數(shù)據(jù)慨蓝,經(jīng)常會使用投影select:
var list= dbContent.Userinfo.select(u=>new {u.Id,U.Name}).ToList();
ViewBag.List=list;
這樣的話庆揩,前臺就無法@foreach(var item in ViewBag.List){//? 在這里使用Table的tr和td循環(huán)}疾瓮,會報錯的俺祠。
除非你在Model層再建一個類來接收瓦堵,這樣的話困鸥,一張表嗅蔬,我在不同的地方使用,稍微增減字段顯示疾就,就得再建一個類澜术,
而且經(jīng)常.join()方法,也得再建類虐译,這很惡心的瘪板。
我百度了N年,也沒答案漆诽。
網(wǎng)上搜索到一些辦法侮攀,如傳Json(缺點是JS里會出現(xiàn)一大堆Json字符串,顯示時又會顯示一大堆厢拭,浪費流量)
轉(zhuǎn)DataTable兰英,(這種方法不應(yīng)該出現(xiàn),從List轉(zhuǎn)成DataTable總覺得不是一個好辦法)
我相信供鸠,肯定有一個好辦法畦贸,只是我不知道,冒昧問如鵬網(wǎng)知道有什么好辦法嗎?
祝如鵬網(wǎng)新年愉快薄坏,學(xué)校越辦越好趋厉,越辦越流行,跨越七大洲八大洋胶坠,我從內(nèi)心里希望如鵬網(wǎng)的教育理念推廣開來君账,如此“用心”的教育機構(gòu)除了如鵬網(wǎng)的現(xiàn)在幾乎就沒有了。
如鵬網(wǎng)老師的回答:
使用C#中的動態(tài)類型dynamic沈善,把匿名類轉(zhuǎn)換為dynamic傳遞給View乡数,上代碼。
1闻牡、首先編寫一個重要的方法ToExpandoObject:
/// <summary>
/// 把普通對象(一般是匿名對象)轉(zhuǎn)換為dynamic對象净赴,支持關(guān)聯(lián)對象
/// 如果把這個方法放到了一個類庫項目中,則需要使用[assembly: InternalsVisibleTo("xxx")]把被轉(zhuǎn)換的類所在的程序集設(shè)置為對類庫項目程序集可見
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static dynamic ToExpandoObject(object obj)
{
if(obj==null)
{
return null;
}
//處理集合類型罩润,注意這里把集合類型統(tǒng)一轉(zhuǎn)換為List玖翅,因此View中不要再使用數(shù)據(jù)的原始集合類型
if (typeof(IEnumerable).IsAssignableFrom(obj.GetType()))
{
List list = new List();
foreach(var item in (IEnumerable)obj)
{
list.Add(ToExpandoObject(item));
}
return list;
}
IDictionary expando = new ExpandoObject();
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(obj.GetType()))
{
object value = property.GetValue(obj);
if(value==null)
{
expando.Add(property.Name, null);
}
else if(value.GetType().IsValueType||value.GetType()==typeof(string))
{
expando.Add(property.Name, value);
}
//如果不是基本數(shù)據(jù)類型或者string,則就是p.dog這樣的關(guān)聯(lián)對象類型割以,進行遞歸處理
else
{
expando.Add(property.Name, ToExpandoObject(value));
}
}
return (ExpandoObject)expando;
}
2烧栋、然后Action中這樣寫:
public ActionResult Index()
{
ViewBag.p = ToExpandoObject(new { name="如鵬",dog=new { name="狗狗",age=3} ,
cats= new List() { new { name = "mimi", age = 2 }, new { name = "miaomiao", age = 66 } }
});
ViewBag.dogs = ToExpandoObject(new List() { new { name = "京巴", age = 13 } , new { name = "藏獒", age =12 } });
return View();
}
通過ToExpandoObject方法把匿名類對象轉(zhuǎn)換為dynamic對象
3、在View中:
@{?
? ? dynamic p = ViewBag.p;
? ? dynamic dogs = ViewBag.dogs;
}
@p.name<br/>
@p.dog.age<br/>
@p.dog.name<br/>
p.cats:<br/>
<ul>
? ? @foreach(dynamic c in p.cats)
? ? {
? ? ? ? <li>@c.name @c.age</li>
? ? }? ??
</ul>
dogs:<br/>
<ul>
? ? @foreach (dynamic d in dogs)
? ? {
? ? ? ? <li>@d.name @d.age</li>
? ? }
</ul>
執(zhí)行效果: