我有两个使用相同视图的asp.net MVC 3 Web项目,我想将这些视图放在一个包含控制器,动作过滤器,扩展方法等常见项目的Web项目中...(项目文件夹就在这两个项目之上。)
我创建了这个自定义视图引擎,修改了视图和局部视图,位置。
public class GenericViewEngine : RazorViewEngine
{
public GenericViewEngine(): this(null)
{ }
public GenericViewEngine(IViewPageActivator viewPageActivator)
{
base.ViewLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/../Framework.Web/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml", "~/../Framework.Web/Views/Shared/{0}.cshtml" };
base.MasterLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/../Framework.Web/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml", "~/../Framework.Web/Views/Shared/{0}.cshtml" };
base.PartialViewLocationFormats = new string[] { "~/Views/{1}/{0}.cshtml", "~/../Framework.Web/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml", "~/../Framework.Web/Views/Shared/{0}.cshtml" };
base.FileExtensions = new string[] { "cshtml" };
}
protected override IView CreatePartialView (ControllerContext controllerContext, string partialPath)
{
return base.CreatePartialView(controllerContext, partialPath);
}
protected override IView CreateView (ControllerContext controllerContext, string viewPath, string masterPath)
{
return base.CreateView(controllerContext, viewPath, masterPath);
}
}
我得到一个异常,说:不能使用前导..退出顶级目录。
如何将这两个项目的常见视图放在每个Web项目之外?是否有任何解决方案可以避免将视图编译到主要的常见Web项目中?
提前致谢。
何。
答案 0 :(得分:0)
是否有任何解决方案可以避免将视图编译到主要的常见Web项目中?
是的,您可以将它们作为资源嵌入到某个插件程序集中,并在多个项目中重用它们。为此,您必须编写一个自定义VirtualPathProvider,它能够从当前应用程序之外的非标准位置加载视图。您还可以查看RazorGenerator project。这是一个accompanying blog post
,解释了一些必要的步骤。基本上你需要安装Razor Generator Extension,它会将你的Razor视图预先编译为你可以在MVC应用程序中引用的类库的一部分。