gpt4 book ai didi

asp.net-mvc-4 - Razor MVC,将可跨母版页、partiview 和 View 访问的全局变量放在哪里?

转载 作者:行者123 更新时间:2023-12-03 21:39:07 24 4
gpt4 key购买 nike

你好 Razor MVC 大师:

新手问题。

背景。我有一个自定义 IIdentity,它在进入 Controller 和 View 之前在 HttpModule 中设置。要使用它,我必须这样做

   MyIdentity myIdentity = (MyIdentity)((GenericPrincipal)context.User).Identity;
MyComplexUser user = myIdentity.User;
//user.name //user.location //user.username //etc

问题是,我在不同的地方使用对象,例如
  • 主布局
  • 一些子级嵌套布局
  • 部分观点
  • 部分观点

  • 这实际上取决于 View 需要的“MyComplexUser”对象的哪些属性。

    目前,在 View 中,我必须执行这个非常复杂的转换才能获得一个属性。例如,如果我想要用户的“姓名”,我需要做

    @(((MyComplexUser)(((MyIdentity)((GenericPrincipal)context.User).Identity).User)).Name)

    我想我可以把它放在 Controller 中,然后用 ViewBag.MyUser 属性填充 ViewBag,但是然后
  • 我不喜欢使用 ViewBag。我更喜欢强类型对象
  • 如果我对 View 使用强类型对象(“MyUser”),那么我必须使用“MyUser”属性来流行所有这些模型。感觉有点脏?因为我喜欢让我的模型保持干净,并具体到他们所涉及的 View 。此外,它会不必要地重复。
  • 在 master_layout.cshtml 或 partialviews 之类的地方,如果我将它们放在 Controller 中,您如何访问“MyUser”?
  • 使用 RenderAction 并为每个 User 属性构建局部 View 是一种矫枉过正吗?

  • 谢谢。同样,我是 MVC 4 的新手,任何建议都非常感谢。

    最佳答案

    我将解释一个对我来说非常有效的类似解决方案。通过小的改动,我相信它也会对你(以及其他人,希望如此)有用。

    基本上,我们将使用 继承 .

    Controller

    让我们创建一个自定义的基本 Controller ,例如

    public class BaseController : Controller

    让我们改变我们的 Controller 来继承它,如
    public class HomeController : BaseController

    模型(我说的是 ViewModel)

    您的模型文件夹中可能有很多类,对吧?它们充当从 Controller 到 View 的 DTO,对吗?
    如果您对两者的回答都是肯定的,请继续阅读。

    让我们创建一个基础模型类,例如 public class BaseVM ,让我们改变我们的模型来继承它,比如 public class HomeIndex : BaseVM
    重要提示:您的布局文件( _Layout 或其他)必须强类型为 BaseVM或它的 child 。

    钩子(Hook)

    现在所有的东西都输入得很漂亮,让我们使用对我们有利的请求管道。
    BaseController ,您将添加一个如下所示的方法:
    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
    if (filterContext.Result is ViewResultBase)//Gets ViewResult and PartialViewResult
    {
    object viewModel = ((ViewResultBase)filterContext.Result).Model;

    if (viewModel != null && viewModel is BaseVM)
    {
    BaseVM baseVM = viewModel as BaseVM;

    baseVM.MyIdentity = (MyIdentity)((GenericPrincipal)context.User).Identity;
    //and so on...
    }
    }

    base.OnActionExecuted(filterContext);//this is important!
    }
    OnActionExecuted被称为 之后 Action 的执行但是 之前 View 渲染。这正是我们想要的。

    我希望你已经明白了。 =)

    关于asp.net-mvc-4 - Razor MVC,将可跨母版页、partiview 和 View 访问的全局变量放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16986251/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com