如何根据查询字符串值更改ASP.Net MVC 5中的主题?

时间:2014-02-27 08:26:12

标签: asp.net-mvc controller themes

我想根据url中的querystring参数动态更改MVC主题。

例如:

  1. 本地主机/ WBE /搜索/ 1
  2. 本地主机/ WBE /搜索/ 2
  3. 本地主机/ WBE /搜索/ 3
  4. 这里1,2,3是我的客户密钥,我有几个客户在我的网站中需要不同的主题。那么,我如何根据这个键改变我网站的布局。

    等待你的回复。

    此致 Mallikharjun。

1 个答案:

答案 0 :(得分:3)

我认为您可以在控制器操作中动态设置布局

public ActionResult Search(int customer)
{
  string layout = ... // function which get layout name with your customer id

  var viewModel = ... // function which get model

  return View("Search", layout, viewModel);
}

修改:

我认为如果你想要一个更好的解决方案来改变所有视图中的布局,你必须创建一个ActionAttributeFilter,它将拦截结果并在viewresult中注入布局

您的过滤器:

public class LayoutChooserAttribute : ActionFilterAttribute
{
    private string _userLayoutSessionKey = "UserLayout";


    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);


        var result = filterContext.Result as ViewResult;
        // Only if it's a ViewResult
        if (result != null)
        {
            result.MasterName = GetUserLayout(filterContext);
        }
    }

    private string GetUserLayout(ActionExecutedContext filterContext)
    {
        if (filterContext.HttpContext.Session[_userLayoutSessionKey] == null)
        {
            // I stock in session to avoid having to start processing every view
            filterContext.HttpContext.Session[_userLayoutSessionKey] = ...; // process which search the layout
        }
        return (string)filterContext.HttpContext.Session[_userLayoutSessionKey];
    }

}

您的行动成为:

[LayoutChooser]
public ActionResult Search(int customer)
{
  var viewModel = ... // function which get model

  return View("Search", viewModel);
}

如果您希望所有操作都存在该属性,请在 FilterConfig.RegisterGlobalFilters 静态方法中添加您的过滤器:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        ...
        filters.Add(new LayoutChooserAttribute());
    }
}