C#在MVC中集中重复VIewData

Mar*_*ijn 6 c# asp.net-mvc viewdata

当用户登录我的应用程序时,我想在整个应用程序中显示他的名字.我正在使用asp.net MVC框架.但我不想要的是必须在每个控制器中添加如下内容:

ViewData["User"] = Session["User"];
Run Code Online (Sandbox Code Playgroud)

这是因为你可能不会重复自己.(我相信这是OO编程的DRY [不要重复自己]原则.)ViewData ["User"]在我的主页上.所以我的问题是,在一个地方处理我的ViewData ["用户"]的简洁方法是什么?

Mar*_*ell 12

您可以在控制器基类或应用于控制器/操作的操作过滤器中相当容易地执行此操作.在任何一种情况下,您都有机会在操作之前(或之后)触摸请求 - 因此您可以在此处添加此功能.

例如:

public class UserInfoAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(
        ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);
        filterContext.Controller.ViewData["user"] = "Foo";
    }
}
...
[HandleError, UserInfo]
public class HomeController : Controller
{...}
Run Code Online (Sandbox Code Playgroud)

(也可以在动作(方法)级别使用)


或者使用共同的基类:

public abstract class ControllerBase : Controller
{
    protected override void OnActionExecuting(
        ActionExecutingContext filterContext)
    {
        ViewData["user"] = "Bar";
        base.OnActionExecuting(filterContext);
    }
}

[HandleError]
public class HomeController : ControllerBase
{...}
Run Code Online (Sandbox Code Playgroud)


Pau*_*art 5

这是一年,但我偶然发现了这个问题,我相信有更好的答案.

Jimmy Bogard将接受的答案中描述的解决方案描述为反模式,并提供更好的解决方案,包括RenderAction:http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/06/18/the-filter-viewdata-抗pattern.aspx