使用不同母版页的相同视图 - ASP.NET MVC

时间:2011-03-22 18:05:37

标签: asp.net-mvc master-pages

我是ASP.net MVC的新手,我想使用视图,但根据用户角色使用不同的母版页。

目前,我倾向于使用一个返回 View1 的控制器,如果用户位于 Role1 View2 位于 role2所即可。 View1 View2 包含相同的局部视图,用于呈现两者共享但具有不同母版页的内容。

我想知道这是一个好习惯还是你推荐另一种设计。做一些简单的事情我的解决方案似乎有点复杂。也许我错过了什么

谢谢!

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

最简单的可能是使用控制器View方法返回Master页面名称

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会让您了解如何创建自定义视图引擎。从那里开始设置主名称。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

在你的控制器中

this.ViewBag.Layout = something
在您的视图中

Layout = this.ViewBag.Layout

答案 4 :(得分:0)

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

您的控制器可以检查角色,并指定要使用的布局,然后在视图中将其分配给@Layout,但您也可以将此代码保留在视图中以确定要使用的布局,因为毕竟这是'查看逻辑'