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

标签 asp.net-mvc-4 razor

你好 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/

    相关文章:

    asp.net-mvc - 来自对象 MVC 的 DropDownList

    javascript - ASP.NET Razor 与 javascript 文字混合

    c# - MVC HttpPostedFileBase 始终为空

    javascript - 将控件标签更改为按钮以访问 Razor View 中的我的条款和条件页面

    ajax - PartialView 不起作用(整个页面刷新)

    asp.net-mvc-4 - 使用 ELMAH 和 ajax 在 ASP.Net MVC 4 中的 Controller 中的异常处理

    css - dl-horizental 中的 EditorFor 和 DisplayNameFor 将彼此靠得太近

    asp.net-mvc - 无法使DropDownListFor在MVC3中的EditorFor上工作

    c# - C# 根据列将DataTable拆分为多个DataTable

    asp.net - graphaeljs错误