3

我正在构建一个 MVC 3 应用程序。应用程序应该能够根据子域显示不同的布局(例如:customer1.mysite.com -> layout1; customer2.mysite.com -> layout2; 等等...)它还将具有移动和布局即 6。

我已经看到它们是 _ViewStart.cshtml,我可以利用它来执行设置布局的逻辑。但我没有得到的是控制器在哪里?我应该在视图中编写所有代码吗?

另一个关于布局的问题,你如何分解常见行为的代码?你有那个控制器吗?

最后一个我在asp.net MVC2中看到了区域的概念,现在我们有了Razor,它已经过时了吗?

感谢您的帮助

弗雷德

4

2 回答 2

2

这听起来像是使用ViewBag的好时机。

这个想法是在OnActionExecuting期间,您将查找子域并将其推入 ViewBag。这可以在您的其他控制器继承的自定义 BaseController 或ActionFilter中完成。

然后,在你的 _ViewStart 中,你可以在 ViewBag 上写一个 switch 语句来控制布局。

例如,这是一个 ActionFilter,它将填充@ViewBag.Subdomain到您的任何 Razor 视图中,包括 _ViewStart.cshtml。

public class AddSubdomainToViewDataAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var subdomain = filterContext.HttpContext.Request.Url.Authority.Split('.').First();
        var controller = filterContext.Controller as Controller;
        controller.ViewData.Add("Subdomain", subdomain);
    }
}

[AddSubdomainToViewData]然后,用这个新属性装饰你的控制器。

最后,在 _ViewStart.cshtml 中,执行如下操作:

@{
    Layout = "~/Views/Shared/" + ((@ViewContext.ViewData["Subdomain"] as String) ?? String.Empty) + "_layout.cshtml";
}

这将为每个子域使用不同的 Razor 布局。

于 2011-03-17T14:15:57.327 回答
1

虽然您可以在 _ViewStart 中执行此操作,但我认为更好的方法是编写一个自定义视图引擎,其中基于用户代理或域包含不同的布局。然后你会有共同的控制器和视图,只有布局会有所不同。

于 2011-03-17T13:10:54.110 回答