1

我想为我的 MVC 应用程序中的所有视图提供已登录用户的实例(如果还没有人登录,则为 null)。我已经成功实现了我自己的 ControllerActionInvoker 类,它覆盖了 InvokeAction 并在 ViewData (controllerContext.Controller.ViewData["LoggedUser"] = xxx) 中提供了记录的用户实例。问题是我想使用强类型模型在整个应用程序中传递记录的用户实例。我正在考虑拥有 ApplicationViewDataBase 类,它可以作为我所有强类型 ViewData 类的基类,并且还可以提供记录的用户实例。我可以在我的所有视图中轻松访问已登录的用户实例。

是否可以像我在 ControllerActionInvoker.InvokeAction 覆盖中实现的那样填写全局强类型?还是以某种方式在 Page.User 中提供我的用户实例更好?我会发现使用 Page.User 可能更巧妙,但也没有找到任何解决方案如何注入我的用户实例......

4

3 回答 3

1

也许将用户放入 HttpContext 的更好方法?在 global.asax

protected void Application_AuthenticateRequest(对象发送者,EventArgs e)

于 2009-03-12T12:14:26.597 回答
1

这是一个老问题,所以只是为了未来访问者的利益,这可以通过创建一个从 Controller 继承的 basecontroller 并处理 OnActionExecuted() 来将您的自定义用户实例添加到控制器操作和视图之间的视图中。这里有一个全面的实现:http: //blog.bitdiff.com/2012/05/sharing-common-view-model-data-in.html

如果您希望这些数据可用于您的操作方法,事情会变得有点复杂,因为视图还不存在。

对于 POST 方法,“baseView = filterContext.Controller.ViewData.Model as BaseView”将使您能够访问视图,但您需要自定义模型绑定器来设置 ViewData.Model(请参阅https://stackoverflow.com/a/25250058/ 2381157)。不幸的是,这不是一个全局解决方案,因为除非有要绑定的东西,否则不会调用模型绑定器。

一种可能适合的方法是向 RouteData 或 ActionParameters 注入值的 ActionFilter 或 AttributeFilter,但您的操作必须将此值传输到视图。

我找不到一种干净、简单的方法将这些数据注入到视图中,因为它被创建并回退到实现用户实例的线程安全缓存,这样我就可以在需要时检索用户实例而无需数据库查询高架。这并不容易,但在保持跨请求用户状态方面具有其他优势(这通常是您希望控制器逻辑可以使用自定义用户数据的原因)。

于 2015-10-14T01:33:09.933 回答
0

你不需要添加这个;它已经在 ASP.NET MVC 中可用。查看 ViewContext.HttpContext.User.Identity.Name

于 2009-03-12T12:32:24.260 回答