我正在使用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。
答案 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