Помните: anonymous
типы являются внутренними, что означает, что их свойства не могут быть видны вне определяющей сборки.
Вам лучше передать объект dynamic
(вместо anonymous
one) в View
, преобразовав тип anonymous
в dynamic
, используя метод расширения.
public class AwesomeController : Controller
{
// Other actions omitted...
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;
}
}
Тем не менее, вы все еще можете передать объект anonymous
, но вам придется преобразовать его и dynamic
один.
public class AwesomeController : Controller
{
// Other actions omitted...
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);
}
}