你好 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,但是然后
谢谢。同样,我是 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/