Asp.net-Mvc

如何在 ASP.NET MVC 3 razor ViewStart 文件中指定不同的佈局?

  • March 1, 2011

我想在我的應用程序中有 2 個單獨的佈局。假設一個用於網站的公共部分,另一個用於會員端。

為簡單起見,假設每個站點的所有邏輯都整齊地包裝在 2 個不同的控制器中。

  • 公共控制器
  • 員工控制器

並且它們每個都有一個對應的佈局,用於每個視圖下的所有視圖。

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

如何使用 _ViewStart.cshtml 文件來指定“Public”下的所有視圖/操作都使用 PublicLayout,而“Staff”下的所有內容都使用 StaffLayout?

您可以在文件夾中放置一個_ViewStart.cshtml文件,該/Views/Public文件將覆蓋文件夾中的預設/Views文件並指定所需的佈局:

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

以此類推,您可以將另一個_ViewStart.cshtml文件放入/Views/Staff文件夾中:

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

您還可以指定在控制器操作中返回視圖時應使用哪種佈局,但這是每個操作:

return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel);

另一種可能性是自定義操作過濾器,它將覆蓋佈局。如您所見,實現這一目標的可能性很多。由您決定哪一個最適合您的場景。


更新:

根據評論部分的要求,這是一個選擇母版頁的操作過濾器範例:

public class LayoutInjecterAttribute : ActionFilterAttribute
{
   private readonly string _masterName;
   public LayoutInjecterAttribute(string masterName)
   {
       _masterName = masterName;
   }

   public override void OnActionExecuted(ActionExecutedContext filterContext)
   {
       base.OnActionExecuted(filterContext);
       var result = filterContext.Result as ViewResult;
       if (result != null)
       {
           result.MasterName = _masterName;
       }
   }
}

然後使用此自定義屬性裝飾控制器或操作,指定您想要的佈局:

[LayoutInjecter("_PublicLayout")]
public ActionResult Index()
{
   return View();
}

引用自:https://stackoverflow.com/questions/5161380