【问题标题】:How to load different Layout pages based on domain name?如何根据域名加载不同的Layout页面?
【发布时间】:2019-02-17 03:05:02
【问题描述】:

我有一个 .NET Core 项目,我将根据子域加载不同的 Layout.cshtml 页面。

应根据子域在数据库中进行查询,该查询将返回代码。根据我的 ViewStart.cshtml 中的这段代码,我将加载不同的布局。

如何获取子域?在哪里?

【问题讨论】:

    标签: c# .net asp.net-core .net-core asp.net-core-2.0


    【解决方案1】:

    您可以简单地将您自己的逻辑添加到您的视图或全局_ViewStart.cshtml 中,根据您自己的标准选择正确的布局。我过去所做的是添加一个ViewData 属性,所以我的_ViewStart.cshtml 看起来像这样:

    @{
      Layout = (string)ViewData["_OverwriteLayout"] ?? "_DefaultLayout";
    }
    

    所以我只需要在 MVC 管道内的某处设置 ViewData["_OverwriteLayout"] 值。我个人是在ResultFilter 内完成的,因此当返回非视图结果时,逻辑不会运行。

    这可能看起来像这样:

    public class CustomLayoutResultFilter : IAsyncResultFilter
    {
        public Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
        {
            if (context.Result is ViewResult viewResult)
            {
                if (context.HttpContext.Request.Host.ToString() == "test.example.com")
                    viewResult.ViewData["_OverwriteLayout"] = "_TestLayout";
            }
    
            return next();
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以创建多个布局,并可以从它们的 ViewStart.cshtml 文件中调用它们。 例如,如果您在与其他布局不同的文件夹中有第二个 _Layout2.cshtml,那么您在此文件夹中创建一个具有此路径的 _ViewStart.cshtml 文件

      @{
        Layout="~/Views/Shared/[your folder]_Layout2.cshtml"
       }
      

      【讨论】:

      • 我知道,这就是我已经拥有的。但是如何获取子域、查询数据库并将结果发送到 ViewStart?
      • 我会查看区域路径的
      • 如果此布局与您从他的控制器调用的索引相关。
      • 我无法为每个控制器执行此操作。我想要这个:用户打开网站->在某处读取网站子域->基于子域查询数据库->返回值->将值传递给 ViewStart。在 Viewstart 中,我已经有一个加载正确布局的 switch 语句
      猜你喜欢
      • 1970-01-01
      • 2010-11-11
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多