为每个视图提供用户对象

时间:2009-08-22 17:40:11

标签: asp.net-mvc

如何为ASP.NET MVC中的每个视图提供一个用户对象,而不必为我拥有的每个视图创建一个ViewModel?

使用ASP.NET Membership时,我只是在视图中使用配置文件信息获取Profile变量,但是当我自己滚动时,我看不到导出该信息的方法。

3 个答案:

答案 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会扩展它。