以下是一些使用反射的选项。在大多数情况下,性能应该可以忽略不计。
实用类
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");
}
在 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");
}