记住:匿名
类型是内部的,这意味着它们的属性不能在定义它们的程序集外部看到。
最好通过将匿名
类型转换为动态
类型,并使用扩展方法将其传递给您的View
,而不是传递匿名
对象。
public class AwesomeController : Controller
{
public ActionResult SlotCreationSucceeded(string email, string roles)
{
return View("SlotCreationSucceeded", new { email, roles }.ToDynamic());
}
}
该扩展方法将如下所示:
public static class DynamicExtensions
{
public static dynamic ToDynamic(this object value)
{
IDictionary<string, object> expando = new ExpandoObject();
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(value.GetType()))
expando.Add(property.Name, property.GetValue(value));
return (ExpandoObject) expando;
}
}
虽然如此,您仍然能够传递一个匿名的对象,但是您需要稍后将其转换为dynamic
对象。
public class AwesomeController : Controller
{
public ActionResult SlotCreationSucceeded(string email, string roles)
{
return View("SlotCreationSucceeded", new { email, roles });
}
}
视图:
@{
var anonymousModel = DynamicUtil.ToAnonymous(Model, new { email = default(string), roles = default(string) });
}
<h1>@anonymousModel.email</h1>
<h2>@anonymousModel.roles</h2>
这个帮助方法看起来像这样:
。
public class DynamicUtil
{
public static T ToAnonymous<T>(ExpandoObject source, T sample)
where T : class
{
var dict = (IDictionary<string, object>) source;
var ctor = sample.GetType().GetConstructors().Single();
var parameters = ctor.GetParameters();
var parameterValues = parameters.Select(p => dict[p.Name]).ToArray();
return (T) ctor.Invoke(parameterValues);
}
}