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";
}