我正在处理一个 MVC5 项目。在这个项目中,我在几乎每次对客户的回复中都有一些我一直想做的事情。
\n\n例如,我总是想查看用户是否登录,如果登录,则将用户的名称及其 ID 放入 ViewBag 变量中,以便在 .cshtml 文件中使用。
\n\n我有一个所有其他控制器都继承自的基本控制器。我的第一个想法是在该控制器的构造函数中执行这些操作,但这不起作用,因为变量User尚不存在。
是否有另一种方法可以做到这一点,而无需在每个 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}\nRun Code Online (Sandbox Code Playgroud)\n\n阅读以下答案中的想法后我的解决方案:
\n\n创建了一个我在基本控制器上触发的动作过滤器。
\n\npublic 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}\nRun 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}\nRun 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
| 归档时间: |
|
| 查看次数: |
7764 次 |
| 最近记录: |