Вот некоторые варианты использования отражения. Производительность должна быть незначительной в большинстве сценариев.
Utility Класс
public static class ModelHelper
{
public static T Data<T>(String key)
{
var html = ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Html;
var model = html.ViewData.Model;
return (T)model.GetType().GetProperty(key).GetValue(model) ;
}
}
вид.cshtml
@(Html.Partial("partial",new { Id="InstructorId"}))
paritial.cshtml файл
@model dynamic
@{
var id = ModelHelper.Data<String>("Id");
}
с более компактной parital вызова в view.cshtml
@{
var instructorId = "InstructorId";
var windowTitle = "Window Title";
var editorPageUrl = "~/View/Editors/Instructors.chstml";
}
@(Html.Partial("partial",new { instructorId, windowTitle, editorPageUrl }))
с переменными скорректированной получить выведенные имена в Файл paritial.cshtml
@model dynamic
@{
var id = ModelHelper.Data<String>("instructorId");
var id = ModelHelper.Data<String>("windowTitle");
var id = ModelHelper.Data<String>("editorPageUrl");
}
Это не трудно создать простой класс вид-модель, но я не люблю классы, которые будут только когда-либо использовать один раз для передачи данных, так что это работает для меня.
Можно также расширить вид по умолчанию базы на
namespace SafetyPlus.Shell.Code
{
public abstract class ExtendedPageBaseClass<TModel> : WebViewPage<TModel> where TModel : class
{
public T Data<T>(String key)
{
return (T)Model.GetType().GetProperty(key).GetValue(Model);
}
public Object Data(String key)
{
return Data<Object>(key);
}
}
}
Зарегистрируйте базовый класс в /Views/web.config
<pages pageBaseType="SafetyPlus.Shell.Code.ExtendedPageBaseClass">
...
</pages>
Получить данные в вашей частичное представление например
@{
var id = Data("Id");
var idTyped = Data<String>("Id");
}
Или использование метода расширения, который я предложил против.
namespace NotYourDefaultNamespace
{
public static class ModelExtensions
{
public static T Data<T>(this Object model, String key)
{
return (T)model.GetType().GetProperty(key).GetValue(model) ;
}
}
}
Эта опция действительно не купить вам что-нибудь, так как мы найти модель из предыдущего метода полезности. Звонок станет.
@{
var id = Model.Data("Id");
}
Это случилось со мной; он работал - и тогда он просто остановился, без уважительной причины. Я не могу понять, почему. Как вы упомянули в другом комментарии: слабо типизированные представления с анонимными типами * do * работают в других местах, например, в шаблонах Visual Studio. Вопрос в том, что заставляет их внезапно перестать работать здесь. – joshcomley