MVC 3布局和控制器

3
我正在构建一个MVC 3应用程序。该应用程序应能够根据子域(例如:customer1.mysite.com -> layout1;customer2.mysite.com -> layout2等)显示不同的布局。它还将具有适用于移动设备和IE 6的布局。
我发现可以利用_ViewStart.cshtml来设置布局的逻辑。但我不确定控制器在哪里?我应该在视图中编写所有代码吗?
在使用布局时,您如何分离常见行为的代码?您是否有一个控制器?
最后一个问题是,在asp.net MVC2中看到了区域的概念,现在有了Razor,这个概念已经过时了吗?
谢谢您的帮助
Fred

顺便提一句 - 您的系统被称为多租户系统/架构。关于这个主题有一些非常好的MVC相关问题。例如http://stackoverflow.com/search?q=asp.net-mvc+multi-tenant。 - Ahmad
2个回答

2
这听起来是使用ViewBag的好时机。
想法是在 OnActionExecuting期间查找子域并将其推送到ViewBag中。这可以在自定义BaseController中完成,从中继承其他控制器,或者从ActionFilter中完成。
然后,在_ViewStart中,您可以编写一个关于ViewBag的switch语句来控制布局。
例如,这里是一个ActionFilter,将在任何Razor视图(包括_ViewStart.cshtml)中填充@ViewBag.Subdomain
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布局。

谢谢Portman, 您认为使用Action Filter更好,还是直接像这样进行? - fred_
@{ var subdomain = this.Context.Request.Url.Authority.Split('.').First(); Layout = "~/Views/Shared/" + ((@ViewContext.ViewData["Subdomain"] as String) ?? String.Empty) + "_layout.cshtml"; } ' - fred_
如果你只是使用子域名,那么忽略ActionFilter,在ViewStart中直接使用HttpContext即可。但我猜你会使用子域名进行数据库查找,这种情况下应该封装在一个ActionFilter中。 - Portman

1

虽然你可以在 _ViewStart 中实现这个功能,但我认为更好的方法是编写一个自定义视图引擎,根据用户代理或域名包含不同的布局。然后您将拥有共同的控制器和视图,只有布局会有所不同。


谢谢Darin,这是一个非常有趣的替代方案。我已经看到过了,但没有任何样例。你知道是否有人已经尝试过吗? http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx: “重要提示:由于_ViewStart.cshtml允许我们编写代码,我们可以选择使我们的布局选择逻辑比基本属性设置更丰富。例如:我们可以根据访问站点的设备类型不同来变化使用的布局模板 - 并针对这些设备使用面向电话或平板电脑优化布局以及面向PC /笔记本电脑的优化布局。” - fred_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接