Asp.net mvc 3 根据url更改控制器中的布局

Asp.net mvc 3 根据url更改控制器中的布局,asp.net-mvc-3,Asp.net Mvc 3,我有控制器PlayerController和里面的操作:查看,信息,列表。 所以在URL“/Player/View”中,我使用默认布局得到结果 我希望根据请求获得不同布局的结果“/外部/视图” 如何实现这一点?您可以指定在“ExternalController”控制器操作中返回视图时应使用的布局 return View("View", "~/Views/Shared/_AnotherLayout.cshtml") 尽管您可以像另一个答案中所建议的那样从控制器覆盖布局,但在我看来,这意味着控制器

我有控制器
PlayerController
和里面的操作:
查看
信息
列表
。 所以在URL“/Player/View”中,我使用默认布局得到结果

我希望根据请求获得不同布局的结果“/外部/视图”


如何实现这一点?

您可以指定在“ExternalController”控制器操作中返回视图时应使用的布局

return View("View", "~/Views/Shared/_AnotherLayout.cshtml")

尽管您可以像另一个答案中所建议的那样从控制器覆盖布局,但在我看来,这意味着控制器在决定UI将是什么方面做得太多了。最好让意见来决定

最接近您要求的是在当前的
“~/Views/\u ViewStart.cshtml”
中执行此操作:

其中,
“~/Views/\u ExternalLayout.cshtml”
是您的可选布局

可能需要检查前面的
“/”
是否正确,我不记得是否正确。

如果将其放在现有的_ViewStart中,则为响应以
“/External”
开头的url而呈现的任何视图都将使用此新布局,否则将使用“普通”布局


另一种方法是使用路由表添加路由值,该值可在此处用于做出布局决策;但为了保持简单,我采用了这种方法。

我将使用相同的PlayerController进行“/External/View”。因此,我应该以某种方式指定路由?@NikitaMartyanov-由于您使用的是同一个控制器,所以我的答案略有改变,原始解决方案适用于不同的控制器,但在重用不同URL的视图和控制器时则不适用。谢谢,Andras-我使用了这种方法(我还添加了路由,因此称为“外部分析/视图”)映射到
PlayerController
@{
  if(Context.Request.Path.StartsWith("/External", StringComparison.OrdinalIgnoreCase))
    Layout = "~/Views/_ExternalLayout.cshtml";
  else
    Layout = "~/Views/_Layout.cshtml";
}