2011-03-22 51 views
2

我是ASP.net MVC的新手,我想使用一个视图,但使用不同的母版页,具体取决于用户角色使用不同母版页的相同视图 - ASP.NET MVC

现在,我扶着使用一个控制器谁返回视图1如果用户在role1上视图2role2所查看1查看2包含内部相同的部分视图,以呈现由两者共享但具有不同母版页的内容。

我想知道这是一种好的做法还是推荐其他设计。我的解决方案似乎有点复杂,要做一些简单的事情。也许我失去了一些东西

谢谢!

回答

6

你可以有它返回基于用户角色的主名称的函数,然后写一个自定义的行为过滤器,将动作后执行,并设置基于当前连接的用户角色对应的母版页:

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

+0

似乎lika一个好主意,我不知道很多关于动作过滤器,但我会去读这个主题。 Hany好链接? – Mathieu 2011-03-22 18:12:50

+0

正在做_Layout = SomeStaticClass.GetMasterNameBasedonUser();不会工作?为什么这么复杂 – Omu 2011-03-22 18:13:12

+0

@Mathieu,是的,这里是一个:http://www.asp.net/mvc/tutorials/understanding-action-filters-cs – 2011-03-22 18:13:37

0

如果你想出第三个角色会发生什么?第四个角色?不要在控制器中放入这种逻辑,如果主页面根据其角色显示不同的内容会怎样?你可以隐藏整个大块<div>或什么都不在主人。然后,只要角色依赖关系发生变化,您就只有一个地方可以更改它。主页面是基于角色的不同?

+0

是的,他们是真的不同 – Mathieu 2011-03-22 18:11:29

0

在你的控制器做

this.ViewBag.Layout = something 

在你看来

Layout = this.ViewBag.Layout 
0

只需选择您的视图布局。 可以动态改变@ {布局= XXX}在MVC 3 见:http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx

你的控制器可以检查的角色,并分配被使用的布局,然后被分配到@Layout在您的视图,但你你同样可以保持这个代码在你看来,以确定使用的布局,因为毕竟这是“视图逻辑”

+0

好吧,我现在仍然在使用asp.net mvc2。 Razor的布局是什么? – Mathieu 2011-03-22 18:19:49

+0

是的 - 只适用于剃刀。如果可以的话,升级 - 它非常值得。 – 2011-03-22 19:12:41

1

有多种方法可以选择各有其优点母版页。

最简单的很可能是使用控制器查看方法

public ViewResult Index() { 

    var masterName = getMasterPageNameForUser(); //get you master page/layout name here 

    return View("Index", masterName, model); 

} 

然而,这会导致一些重复的代码返回主网页的名称,这样的替代可能是创建一个自定义IViewEngine并设置主名称那里。 Scott Hanselman's postthis coder journal post会给你一个如何创建自定义视图引擎的想法。从那里可以设置主名称。

相关问题