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

Jen*_*nsB 5 c# asp.net-mvc-5

我正在处理一个 MVC5 项目。在这个项目中,我在几乎每次对客户的回复中都有一些我一直想做的事情。

\n\n

例如,我总是想查看用户是否登录,如果登录,则将用户的名称及其 ID 放入 ViewBag 变量中,以便在 .cshtml 文件中使用。

\n\n

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

\n\n

是否有另一种方法可以做到这一点,而无需在每个 Action 中调用 Setup() 方法?\n我可以侦听在返回 ActionResult 之前触发的某些事件并在那里插入我的 ViewBag 数据吗?

\n\n

不起作用的示例;)

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

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

\n\n

创建了一个我在基本控制器上触发的动作过滤器。

\n\n
public class UserDataFilter : ActionFilterAttribute\n{\n    //OnActionExecuting \xe2\x80\x93 This method is called before a controller action is executed.\n    //OnActionExecuted \xe2\x80\x93 This method is called after a controller action is executed.\n    //OnResultExecuting \xe2\x80\x93 This method is called before a controller action result is executed.\n    //OnResultExecuted \xe2\x80\x93 This method is called after a controller action result is executed.\n\n    public override void OnActionExecuting(ActionExecutingContext filterContext)\n    {\n        base.OnActionExecuting(filterContext);\n\n        var User = filterContext.HttpContext.User;\n\n        if (User.Identity.IsAuthenticated == true)\n        {\n            using (var db = new USDatabase()) { \n                var usr = db.UserProfiles.Where(x => x.UserName.ToLower() == User.Identity.Name.ToLower()).FirstOrDefault();\n                if (usr != null)\n                {\n                    var ViewBag = filterContext.Controller.ViewBag;\n\n                    ViewBag.UserName = usr.UserName;\n                    ViewBag.UserId = usr.Id;\n                }\n            }\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
[InitializeSimpleMembership]\n[UserDataFilter]\npublic class BaseController : Controller\n{\n    protected USDatabase _database = new USDatabase();\n    public BaseController()\n    {\n\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

小智 2

是的..您需要的是一个Action Filter ,动作过滤器是从ActionFilterAttribute继承的 .net 属性,您可以使用它们执行您指定的操作,这里有一个了解它们的链接以及一些有关如何使用它们的基本示例: http: //www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/understanding-action-filters-cs