如何为ASP.NET MVC中的每个视图提供一个用户对象,而不必为我拥有的每个视图创建一个ViewModel?
使用ASP.NET Membership时,我只是在视图中使用配置文件信息获取Profile变量,但是当我自己滚动时,我看不到导出该信息的方法。
答案 0 :(得分:2)
从基本控制器继承您的控制器。在基本控制器中覆盖OnActionExecuting
并在此处设置ViewData["UserObject"]
。像这样:
public class YourBaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.Controller.ViewData["UserObject"] = ...
}
}
如果您只希望某些控制器提供用户对象,则使用相同的OnActionExecuting
方法创建自定义过滤器。
<强>更新:强>
如果您不想每次都投放ViewData["UserObject"]
,请创建自定义Html帮助器:
public static object RenderUserObject(this HtmlHelper html)
{
return ((html.ViewData["UserObject"] as UserObject) ?? new UserObject()).ToString();
}
答案 1 :(得分:0)
从具有ViewModel
属性的主ViewModel
继承您的User
个类。
或者,您可以传递ViewData
集合中的对象并使用扩展方法,以便在视图中轻松访问该对象。
答案 2 :(得分:0)
拥有基类ViewModel
类的一种替代方法是,必须为每个视图定义一个ViewModel类,就是创建一个公共ViewModel<T>
类,它暴露一个属性T InnerModel
,或者相似的东西。然后,您可以传递ViewModel<Foo>
,而不必显式创建FooViewModel
类。
当然,如果您还需要更多定制的ViewModel,您可以保留ViewModel
基类,并拥有ViewModel<T>
,并且您的定制ViewModel会扩展它。