我想根据url中的querystring参数动态更改MVC主题。
例如:
这里1,2,3是我的客户密钥,我有几个客户在我的网站中需要不同的主题。那么,我如何根据这个键改变我网站的布局。
等待你的回复。
此致 Mallikharjun。
答案 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());
}
}