我是ASP.net MVC的新手,我想使用一个视图,但使用不同的母版页,具体取决于用户角色。使用不同母版页的相同视图 - ASP.NET MVC
现在,我扶着使用一个控制器谁返回视图1如果用户在role1上和视图2在role2所。 查看1和查看2包含内部相同的部分视图,以呈现由两者共享但具有不同母版页的内容。
我想知道这是一种好的做法还是推荐其他设计。我的解决方案似乎有点复杂,要做一些简单的事情。也许我失去了一些东西
谢谢!
我是ASP.net MVC的新手,我想使用一个视图,但使用不同的母版页,具体取决于用户角色。使用不同母版页的相同视图 - ASP.NET MVC
现在,我扶着使用一个控制器谁返回视图1如果用户在role1上和视图2在role2所。 查看1和查看2包含内部相同的部分视图,以呈现由两者共享但具有不同母版页的内容。
我想知道这是一种好的做法还是推荐其他设计。我的解决方案似乎有点复杂,要做一些简单的事情。也许我失去了一些东西
谢谢!
你可以有它返回基于用户角色的主名称的函数,然后写一个自定义的行为过滤器,将动作后执行,并设置基于当前连接的用户角色对应的母版页:
public class MasterChooserAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
var result = filterContext.Result as ViewResult;
if (result != null)
{
var user = filterContext.HttpContext.User;
result.MasterName = GetMaster(user);
}
}
private string GetMaster(IPrincipal user)
{
// TODO: based on the current user roles return the proper master page
throw new NotImplementedException();
}
}
然后用这个动作过滤器简单地装饰你的基础控制器,或者如果这是一个ASP.NET MVC 3应用程序,只需声明它为global filter。
如果你想出第三个角色会发生什么?第四个角色?不要在控制器中放入这种逻辑,如果主页面根据其角色显示不同的内容会怎样?你可以隐藏整个大块<div>
或什么都不在主人。然后,只要角色依赖关系发生变化,您就只有一个地方可以更改它。主页面是基于角色的不同?
是的,他们是真的不同 – Mathieu 2011-03-22 18:11:29
在你的控制器做
this.ViewBag.Layout = something
在你看来
Layout = this.ViewBag.Layout
只需选择您的视图布局。 可以动态改变@ {布局= XXX}在MVC 3 见:http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx
你的控制器可以检查的角色,并分配被使用的布局,然后被分配到@Layout在您的视图,但你你同样可以保持这个代码在你看来,以确定使用的布局,因为毕竟这是“视图逻辑”
好吧,我现在仍然在使用asp.net mvc2。 Razor的布局是什么? – Mathieu 2011-03-22 18:19:49
是的 - 只适用于剃刀。如果可以的话,升级 - 它非常值得。 – 2011-03-22 19:12:41
有多种方法可以选择各有其优点母版页。
最简单的很可能是使用控制器查看方法
public ViewResult Index() {
var masterName = getMasterPageNameForUser(); //get you master page/layout name here
return View("Index", masterName, model);
}
然而,这会导致一些重复的代码返回主网页的名称,这样的替代可能是创建一个自定义IViewEngine
并设置主名称那里。 Scott Hanselman's post和this coder journal post会给你一个如何创建自定义视图引擎的想法。从那里可以设置主名称。
似乎lika一个好主意,我不知道很多关于动作过滤器,但我会去读这个主题。 Hany好链接? – Mathieu 2011-03-22 18:12:50
正在做_Layout = SomeStaticClass.GetMasterNameBasedonUser();不会工作?为什么这么复杂 – Omu 2011-03-22 18:13:12
@Mathieu,是的,这里是一个:http://www.asp.net/mvc/tutorials/understanding-action-filters-cs – 2011-03-22 18:13:37