MVC5基本控制器,可以设置应该始终完成的事情

时间:2014-10-23 08:37:41

标签: c# asp.net-mvc-5

我正在使用MVC5项目。在这个项目中,我总是想在客户的每一个响应中做一些事情。

例如,我总是希望查看用户是否已登录,如果是,则将用户名和他们的id放入ViewBag变量中,以便在.cshtml文件中使用。

我有一个所有其他控制器继承的基本控制器。我的第一个想法是在该控制器的构造函数中执行这些操作,但这不起作用,因为User变量尚不存在。

有没有其他方法可以执行此操作,而无需在每个Action中调用Setup()方法? 我可以在返回ActionResult并在那里插入ViewBag数据之前听一些触发的事件吗?

什么不起作用的例子;)

[InitializeSimpleMembership]
public class BaseController : Controller
{
    protected USDatabase _database = new USDatabase();
    public BaseController()
    {
        if (User.Identity.IsAuthenticated == true)
        {
            var usr = _database.UserProfiles.Where(x => x.UserName.ToLower() == User.Identity.Name.ToLower()).FirstOrDefault();
            if (usr != null)
            {
                ViewBag.UserName = usr.UserName;
                ViewBag.UserId = usr.Id;
            }
        }
    }
}

在阅读以下答案中的想法后,我的解决方案:

创建了一个在基本控制器上触发的Actionfilter。

public class UserDataFilter : ActionFilterAttribute
{
    //OnActionExecuting – This method is called before a controller action is executed.
    //OnActionExecuted – This method is called after a controller action is executed.
    //OnResultExecuting – This method is called before a controller action result is executed.
    //OnResultExecuted – This method is called after a controller action result is executed.

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        var User = filterContext.HttpContext.User;

        if (User.Identity.IsAuthenticated == true)
        {
            using (var db = new USDatabase()) { 
                var usr = db.UserProfiles.Where(x => x.UserName.ToLower() == User.Identity.Name.ToLower()).FirstOrDefault();
                if (usr != null)
                {
                    var ViewBag = filterContext.Controller.ViewBag;

                    ViewBag.UserName = usr.UserName;
                    ViewBag.UserId = usr.Id;
                }
            }
        }
    }
}

基本控制器现在看起来像这样:

[InitializeSimpleMembership]
[UserDataFilter]
public class BaseController : Controller
{
    protected USDatabase _database = new USDatabase();
    public BaseController()
    {

    }
}

我所有其他控制器都实现了BaseController。

2 个答案:

答案 0 :(得分:2)

是..您需要的是操作过滤器,操作过滤器是.net属性继承自 ActionFilterAttribute 您可以执行您使用它们指定的内容,这里是一个链接了解它们以及一些关于你用它们做什么的基本样本: http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/understanding-action-filters-cs

答案 1 :(得分:0)

看看http://msdn.microsoft.com/en-us/library/system.web.mvc.controller(v=vs.98).aspx:根据具体情况,您可以使用各种活动。 例如:OnActionExecuting,OnActionExecuted