【问题标题】:Change Layout(Master Page) of view in ASP.NET MVC without recreate it在 ASP.NET MVC 中更改视图的布局(母版页)而不重新创建它
【发布时间】:2012-01-20 21:56:39
【问题描述】:

我正在使用带有 Razor 视图的 ASP.NET MVC 3。当你想创建一个视图时,你可以为你的视图选择一个布局(母版页),或者让它选择默认(_Layout)。

我有兴趣在创建视图后更改此布局而不重新创建它,是否有任何地方可以存储有关视图的布局信息?我该如何改变它?

【问题讨论】:

  • “不重新创建”到底是什么意思?如何重新创建?怎么改?您的意思是在不重新加载页面的情况下更改布局?你需要更具体。

标签: c# asp.net .net asp.net-mvc asp.net-mvc-3


【解决方案1】:

在 cshtml 文件顶部创建视图后,您可以看到包含的布局。

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

你可以简单地用不同的布局替换它

@{
    Layout = "~/Views/Shared/_Layout2.cshtml";
}

此外,您可以将其存储在基本布局 (_ViewStart.cshtml) 中,然后您的所有视图都将使用该布局。

【讨论】:

    【解决方案2】:

    在 MVC3 中有 _ViewStart.cshtml 存储所有页面的布局;您可以更改此元素以更改所有页面的布局,也可以在 @{} 块中的目标视图页面顶部添加新的 Layout 元素,如下所示更改特定页面的布局:

    @{
        Layout = "~/Views/Shared/_newLayout.cshtml";
        ViewBag.Title = "Index";
    }
    

    【讨论】:

      【解决方案3】:

      我们可以在 _ViewStart 文件中使用以下代码更改布局的默认渲染:

      @{
       var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();
      
       string layout = "";
       if (controller == "Admin")
       {
       layout = "~/Views/Shared/_AdminLayout.cshtml";
       }
       else
       {
       layout = "~/Views/Shared/_Layout.cshtml";
       }
      
       Layout = layout;
      }
      

      【讨论】:

      • 这段代码在控制器中会更好(Admin 的特定布局,其他人保持默认)。
      • 参考链接可以找到here
      【解决方案4】:

      有多种方法可以为视图指定不同的布局,具体取决于您的需要:

      在视图中

      正如其他答案中提到的,只需更改视图的 Layout 属性:

      @{
          Layout = "~/Views/Shared/_CustomLayout.cshtml";
      }
      

      在_ViewStart.cshtml中

      MVC 3 added a default Views/_ViewStart.cshtml 可以将所有视图共享的逻辑放入其中。您还可以在任何 Views 子目录中创建额外的 _ViewStart.cshtml 文件以获得额外的自定义逻辑(它将在层次结构和 Shared 文件夹中搜索,就像查找任何其他视图或部分视图时一样)。

      在这里面放很多业务逻辑,感觉违反了“关注点分离”的原则,但同时又可以很得心应手。

      请注意_ViewStart.cshtml 继承自StartPage,而不是WebPage,因此它的属性可能与您习惯的略有不同(例如,您必须通过ViewContext 才能获得ViewBag) .

      @{
          if (ViewContext.ViewBag.IsAdmin) // or other custom logic
          {
              Layout = "~/Views/Shared/_AdminLayout.cshtml";
          }
          else
          {
              Layout = "~/Views/Shared/_Layout.cshtml";
          }
      }
      

      在控制器动作中

      View() 方法有一个重载,它采用显式布局页面(Intellisense 将其称为“母版页”):

          public ActionResult FooAction()
          {
              var model = new MyModel();
      
              return View("Index", "_CustomLayout", model);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-29
        • 1970-01-01
        • 1970-01-01
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多