ASP MVC主题领域

时间:2012-10-29 14:27:42

标签: asp.net-mvc layout themes asp.net-mvc-areas

我正在寻找一种解决方案,用户可以根据自己的喜好选择主题和布局。

假设我有一个提供2个主题的网站:黄色和绿色。

这两个布局有两种不同的布局:2列和3列布局,部分局部视图的结构不同,功能也不同。

我认为最好的方法是使用区域,但我不想要的是根本不需要改变的URL结构。我会使用一个变量来设置执行动作时幕后的区域。

例如,我将布局设置为3列并使用绿色主题。 我会使用3Cols区域的特定视图,但控制器实现与2Cols布局完全相同的代码,因此,我不想复制控制器。

所以,回顾一下我想要实现的目标是:

  • 使用区域切换布局和主题
  • 为每个布局使用单个控制器
  • 从所选布局中独立显示相同的网址

有关于此的任何想法/建议吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我已经设法得到了我正在寻找的工作,我认为这很简单!

我已经创建了一个BaseController类:

public class BaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.RouteData.DataTokens["area"] = CurrentLayout;
        base.OnActionExecuting(filterContext);
    }

    public string CurrentLayout
    {
        get
        {
            //Set a default layout if no layout is specified
            if(Session["CurrentLayout"]==null)
                Session["CurrentLayout"] = "Layout1";
            return Session["CurrentLayout"].ToString();
        }

        set
        {
            if (string.IsNullOrWhiteSpace(value) || string.IsNullOrEmpty(value))
                throw new NullReferenceException("CurrentLayout");
            CurrentLayout = value;
        }
    }
}

然后,在会话开始时,我读取用户的配置文件,并将其选定的布局放在BaseController正在读取的会话变量中。

不需要其他任何东西!

希望这有助于其他人。

谢谢!

相关问题