多视图文件夹C#ASP MVC4
我正在使用Razor引擎渲染我的视图,我想对其进行一些自定义,以获得与默认视图不同的行为 对于相同的数据,我有不同的视图,我想重用它们,但我要在外部指定子文件夹的更改 这是一棵树:多视图文件夹C#ASP MVC4,c#,asp.net,asp.net-mvc,asp.net-mvc-4,razor,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Razor,我正在使用Razor引擎渲染我的视图,我想对其进行一些自定义,以获得与默认视图不同的行为 对于相同的数据,我有不同的视图,我想重用它们,但我要在外部指定子文件夹的更改 这是一棵树: 观点 一, 控制器名称 Files.cshtml 共享 _Layout.cshtml 二, 控制器名称 Files.cshtml 共享 _OtherLayout.cshtml 等等 唯一不同的是子文件夹,其他所有内容都是相同的(除了cshtml文件的内容^^)。如何根据我的好意切换到正
- 观点
- 一,
- 控制器名称
- Files.cshtml
- 共享
- _Layout.cshtml
- 控制器名称
- 二,
- 控制器名称
- Files.cshtml
- 共享
- _OtherLayout.cshtml
- 控制器名称
- 等等
- 一,
有三种方法可以做到这一点:
VirtualPathProviderViewEngine.cs
返回视图(“~/stack/en/owerflow.cshtml”)
returnview(RouteData.Values[“id”]+“/stackowerflow.cshtml”)
真正的问题是什么?您想知道如何使
id
动态化吗?我想我可以得到它。主要问题是如何在视图之间切换。如果我将id更改为“2”(动态或非动态),我希望引擎在子文件夹2中查找视图。您是否调试了代码?您的代码是否命中FileExists
方法?如果没有,那么您的CustomViewEngine
就根本不用了。我甚至在使用任何东西之前都在使用404'ing。。。即使在我尝试@alex-v-kostyukov的基本功能时,通过返回到我的视图的正确路径(并取消激活该自定义引擎),让我们看看您的Global.asax
文件和路由注册部分中有什么内容。我粘贴的代码主要来自解决方案1中的代码示例,因此不起作用。第二种方法是基本的,但很有效,我正在尝试检查除此之外的其他方法(但如果需要的话,我会去检查),因为第一种方法是微软推荐的。它不是在所有样本中都有效,还是仅仅在您的项目中有效?你们在下载的解决方案示例中试用过吗?很好,答案很好。我使用我的解决方案的旧版本再次尝试了1和2,结果成功了。我不知道404是从哪里来的
public class CustomViewEngine : RazorViewEngine
{
public CustomViewEngine()
{
ViewLocationFormats = new[]
{
"~/Views/%1//{1}/{0}.cshtml",
"~/Views/%1//Shared/{0}.cshtml"
};
MasterLocationFormats = new[]
{
"~/Views/%1/{1}/{0}.cshtml",
"~/Views/%1/Shared/{0}.cshtml",
};
PartialViewLocationFormats = new[]
{
"~/Views/%1/{1}/{0}.cshtml",
"~/Views/%1/Shared/{0}.cshtml"
};
}
protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
{
var id = "1";
return base.CreatePartialView(controllerContext, partialPath.Replace("%1", id));
}
protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
{
var id = "1";
return base.CreateView(controllerContext, viewPath.Replace("%1", id), masterPath.Replace("%1", id));
}
protected override bool FileExists(ControllerContext controllerContext, string virtualPath)
{
var id = "1";
return base.FileExists(controllerContext, virtualPath.Replace("%1", id));
}
}