标签: virtualpathprovider

使用VirtualPathProvider从DLL加载ASP.NET MVC视图

基于这个问题,在这里和使用代码发现在这里,我试图加载嵌入资源在一个单独的DLL项目的意见,原来的问题的作者说,他已成功这样做-但我不能把它作为工作似乎MVC视图引擎正在拦截请求,仍然在查看视图的文件系统.例外:

Server Error in '/' Application.
The view 'Index' or its master could not be found. The following locations were searched:
~/Views/admin/Index.aspx
~/Views/admin/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
~/App/Views/admin/Index.aspx
~/App/Views/admin/Index.ascx
~/App/Views/Shared/Index.aspx
~/App/Views/Shared/Index.ascx 
Run Code Online (Sandbox Code Playgroud)

我使用的是CustomViewEngine像Rob Connery的/ App结构,如下所示:

public class CustomViewEngine : WebFormViewEngine
    {
         public CustomViewEngine()
         {
             MasterLocationFormats = new[] { 
                "~/App/Views/{1}/{0}.master", 
                "~/App/Views/Shared/{0}.master" 
                };

             ViewLocationFormats = new[] { 
                "~/App/Views/{1}/{0}.aspx", 
                "~/App/Views/{1}/{0}.ascx", 
                "~/App/Views/Shared/{0}.aspx", 
                "~/App/Views/Shared/{0}.ascx" 
                };

             PartialViewLocationFormats = ViewLocationFormats;
         }
    }
Run Code Online (Sandbox Code Playgroud)

这是我的路线:

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute("Home", "", new {controller = "Page", action = "Index", id …
Run Code Online (Sandbox Code Playgroud)

asp.net asp.net-mvc virtualpathprovider

40
推荐指数
1
解决办法
3万
查看次数

使用自定义VirtualPathProvider加载嵌入式资源部分视图

我编写了自定义VirtualFile和VirtualPathProvider实现,这些实现成功获取了部分视图的嵌入式资源.

但是,当我尝试渲染它们时会产生此错误:

The view at '~/Succeed.Web/Succeed.Web.Controls.SImporter._SImporter.cshtml' must derive from WebViewPage, or WebViewPage<TModel>.

渲染局部视图时,在常规视图内部,它看起来如下所示:

Html.RenderPartial("~/Succeed.Web/Succeed.Web.Controls.SImporter._SImporter.cshtml");
Run Code Online (Sandbox Code Playgroud)

是什么让它相信这不是局部观点?

编辑:我为虚拟文件和虚拟文件提供程序实现发布了我的代码,任何人偶然发现这个寻找解决方案来获得该组件的工作.这个问题也适用于基于问题标题的人.

ere是VirtualFile实现以供参考:

public class SVirtualFile : VirtualFile
{
    private string m_path;

    public SVirtualFile(string virtualPath)
        : base(virtualPath)
    {
        m_path = VirtualPathUtility.ToAppRelative(virtualPath);
    }

    public override System.IO.Stream Open()
    {
        var parts = m_path.Split('/');
        var assemblyName = parts[1];
        var resourceName = parts[2];

        assemblyName = Path.Combine(HttpRuntime.BinDirectory, assemblyName);
        var assembly = System.Reflection.Assembly.LoadFile(assemblyName + ".dll");

        if (assembly != null)
        {
            return assembly.GetManifestResourceStream(resourceName);
        }
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

的VirtualPathProvider:

public class SVirtualPathProvider : …
Run Code Online (Sandbox Code Playgroud)

virtualpathprovider partial-views embedded-resource asp.net-mvc-3

36
推荐指数
2
解决办法
2万
查看次数

类库中的MEF和Razor视图

我有一个使用MEF的复合ASP .NET MVC 3 Razor应用程序.如果我要Views在应用程序的常规文件夹下部署插件作为DLL文件和视图(CSHTML),一切都会好起来的.但这不是很干净,如果我不将视图作为嵌入式资源放在DLL文件中(以及控制器和模型),它将不是真正的插件.

我跟着很多文章(其中大部分都已过时).事实上,Stack Overflow上有一个非常好的:类库中的控制器和视图

我还检查了文档VirtualPathProvider,我已经能够构建一个自定义文件,在程序集中找到该文件并完美加载它(或至少获取它的流).为此,我遵循了VirtualPathProvider MSDN上文档.

VirtualFile还有一个实现,但VirtualDirectory尚未实现.

这是问题所在.我正在使用Razor的观点.我知道他们需要web.configRazor文件中的配置规范来构建它们.但是如果我将它们嵌入到DLL中,那么这个配置就会丢失.

我想知道这是不是我继续得到错误的原因:

'〜/ Plugins/CRM.Web.Views.CRM.Index.cshtml'中的视图必须从WebViewPage或WebViewPage派生.

也许我只需要添加一些代码来使它工作?有任何想法吗?

asp.net-mvc virtualpathprovider embedded-resource razor asp.net-mvc-3

28
推荐指数
2
解决办法
1万
查看次数

使用预编译的Razor视图和VirtualPathProviders时找不到文件PrecompiledApp.config

我们有一个使用WebForms .aspx文件的应用程序几乎所有东西.Latley我们一直在使用预编译的RazorViews,通过简单地在我们的项目中删除一个新的dll来获取nicley打包功能.但现在我们发现我们的预编译视图似乎与我们的VirtualPathProviders冲突.

从外部dll加载VirtualPathProviders时,应用程序尝试为所有请求加载PrecompiledApp.config(我们没有得到它)​​.提供者加载了反射.我们在注册的同一个项目中有一些VirtualPathProviders,它们工作正常,但是当我们从外部dll注册提供程序时,HostingEnvironment.RegisterVirtualPathProvider我们遇到了这个问题.

如果我们添加文件PrecompiledApp.config,它会尝试获取_appstart.cshtml,依此类推.在通过这个例外之前我们必须拥有以下所有的所有文件:

  • PrecompiledApp.config
  • _appstart.cshtml
  • _PageStart.cshtml
  • _ViewStart.cshtml
  • 查看/ _ViewStart.cshtml
  • 查看/共享/ _ViewStart.cshtml
  • default.cshtml

我们最终在default.cshtml中,其余的应用程序工作.由于我们希望使用apsx文件作为默认值,因此这不是一个可接受的解决方案.我们也担心会出现更多问题,因为我们不知道为什么会这样.

我们尝试过这种加载我们的提供程序的方法,但我们仍然得到同样的错误:http: //sunali.com/2008/01/09/virtualpathprovider-in-precompiled-web-sites/

例外情况:

Could not find file 'C:\MyApp\PrecompiledApp.config'.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.IO.FileNotFoundException: Could not find file 'C:\MyApp\PrecompiledApp.config'.

Source Error: 

An unhandled exception was generated during the execution of the current web request. …
Run Code Online (Sandbox Code Playgroud)

asp.net virtualpathprovider webforms precompiled razor

24
推荐指数
1
解决办法
2102
查看次数

ASP.NET在Bundling中使用嵌入式资源

我正在尝试实现一种通用方法,为我的Web解决方案中的不同程序集提供使用嵌入式资源中嵌入的JavaScript和CSS文件的可能性.此博客文章显示了使用VirtualPathProvider的技术.这很好,但VirtualPathProvider需要包含在包含嵌入资源的每个程序集中.

我试图从博客文章中增强VirtualPathProvider,以便可以将程序集传递给它并从程序集中加载资源:

public EmbeddedVirtualPathProvider(VirtualPathProvider previous, Assembly assembly)
{
    this.previous = previous;
    this.assembly = assembly;
}
Run Code Online (Sandbox Code Playgroud)

初始化时,它从传递的程序集中读取所有嵌入的资源:

protected override void Initialize()
{
    base.Initialize();

    this.assemblyResourceNames = this.assembly.GetManifestResourceNames();
    this.assemblyName = this.assembly.GetName().Name;
}
Run Code Online (Sandbox Code Playgroud)

GetFile从传递的程序集中读取内容:

public override VirtualFile GetFile(string virtualPath)
{
    if (IsEmbeddedPath(virtualPath))
    {
        if (virtualPath.StartsWith("~", System.StringComparison.OrdinalIgnoreCase))
        {
            virtualPath = virtualPath.Substring(1);
        }

        if (!virtualPath.StartsWith("/", System.StringComparison.OrdinalIgnoreCase))
        {
            virtualPath = string.Concat("/", virtualPath);
        }

        var resourceName = string.Concat(this.assembly.GetName().Name, virtualPath.Replace("/", "."));
        var stream = this.assembly.GetManifestResourceStream(resourceName);

        if (stream != null)
        {
            return new EmbeddedVirtualFile(virtualPath, stream);
        } …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc virtualpathprovider embedded-resource bundling-and-minification

15
推荐指数
1
解决办法
1762
查看次数

ASP.NET捆绑/缩小和嵌入式资源

我正在尝试使用此博客中描述的技术将嵌入式DLL资源添加到我的捆绑包中.

我在VirtualPathProvider下面创建了自定义.

public class EmbeddedVirtualPathProvider : VirtualPathProvider {

    private Type _rootType;

    public EmbeddedVirtualPathProvider(Type rootType) {
        _rootType = rootType;
    }

    public override bool FileExists(string virtualPath) {
        if (IsEmbeddedPath(virtualPath))
            return true;
        else
            return Previous.FileExists(virtualPath);
    }

    public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) {
        if (IsEmbeddedPath(virtualPath)) {
            return null;
        }
        else {
            return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
        }
    }

    public override VirtualDirectory GetDirectory(string virtualDir) {
        return Previous.GetDirectory(virtualDir);
    }

    public override bool DirectoryExists(string virtualDir) {
        return Previous.DirectoryExists(virtualDir);
    }

    public …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc virtualpathprovider bundling-and-minification

13
推荐指数
1
解决办法
2444
查看次数

无法调试通过自定义VirtualPathProvider加载的EmbeddedResource视图

我已经编写了一个自定义的VirtualPathProvider(这里是源代码),它将返回EmbeddedResources中的内容,或者从原始文件返回内容,如果它已被告知在哪里找到它(这允许您编辑和更新文件而无需重建).到目前为止,这工作正常.

什么是无效的是调试.如果我向视图添加断点,则不会加载符号.我可以看出为什么这很困难(ASP编译器如何知道源文件的位置,以便发现断点?),但我正在寻找一种方法来提示可以找到源文件的编译器.

示例项目:http://dl.dropbox.com/u/2808109/VppDebugTest.zip

编辑:

我一直在试验通过VPP加载的ASPX页面,并查看Compiled Source(使用David Ebbo的技术),生成的行编译指示如下:

Line 275:              #line 1 "http://server/EmbeddedPage.aspx"
Line 276:              this.InitializeCulture();
Run Code Online (Sandbox Code Playgroud)

通常,这些是沿着这些线生成的

Line 275:              #line 1 "d:/somesln/someproj/EmbeddedPage.aspx"
Run Code Online (Sandbox Code Playgroud)

不知道这有助于任何人,或不...

编辑2:

大卫发给我他的代码后,我做了一些进一步的调查,以下事情似乎是真的:

  1. 您不能在.aspx中设置断点,除非引用了system.web(在VS 2010中)
  2. 如果你用指令创建一个最小的.aspx页面<%@ Page Language="C#" %>并设置一个断点,VS将停在源文件的断点处

  3. 如果您使用指令创建非最小的.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="VppDebugTest.WebForm1" %>并设置断点,则在查看VS时将带您进入dissasembly调试视图

--- http://server/WebForm1.aspx ------------------------------------------------ 0000003a mov ecx,dword ptr [ebp-3Ch] 0000003d call 63EC54F0 00000042 mov dword ptr [ebp-44h],eax 00000045 mov edx,dword ptr ds:[03E62200h] 0000004b mov ecx,dword ptr [ebp-44h]

它仍然不会停留在Razor视图的任何断点处,遗憾的是我真正需要做的事情!这个.aspx的东西可能是红鲱鱼.

编辑:

5:如果我将Debugger.Break()调用到我的Index.cshtml中,调试器在反汇编视图中停止,并且根本没有编译指示,不正确或其他

  1. 如果我@{ #line …

asp.net compiler-construction debugging virtualpathprovider embedded-resource

10
推荐指数
1
解决办法
1326
查看次数

虚拟路径提供程序禁用缓存?

我有一个虚拟路径提供程序.问题是它缓存我的文件.每当我手动编辑其中一个aspx文件时,它引用VPP不会拉入新文件,它会继续重用旧文件,直到我重新启动站点.

我甚至在我的VirtualPathProvider类中过度使用了GetCacheDependency():

    public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart)
    {
        return null;
    }
Run Code Online (Sandbox Code Playgroud)

想法?

c# virtualpathprovider caching

8
推荐指数
2
解决办法
6044
查看次数

ASP.NET MVC 2 VirtualPathProvider GetFile每次都针对每个请求

我已经实现了VirtualPathProvider.VirtualPathProvider从文件系统中读取视图.

但是我的问题是GetFile(string virtualPath)每次请求都不会执行该方法.我认为这与缓存有关,不是吗?我想要的是每次请求每次获取文件.因为在某些情况下,文件系统中的页面将被修改,用户希望系统立即显示更改.

谢谢.

asp.net-mvc virtualpathprovider asp.net-mvc-2

8
推荐指数
1
解决办法
2702
查看次数

带有静态文件问题的ASP.NET VirtualPathProvider

我在Windows 7上运行IIS 7.5.我的ASP .NET应用程序使用VirtualPathProvider.我的VirtualPathProvider返回并渲染了大多数文件(aspx页面).静态文件(css/images)不是.如果我尝试直接浏览它们(或者如果它们被我的虚拟aspx页面引用),它们会产生HTTP 404错误

我已经验证了我的web.config具有为静态文件类型注册的正确处理程序.

这有点奇怪:

  1. 如果我尝试浏览非虚拟gif文件(实际存在于网站根目录下的文件系统上的文件),则呈现正常.

  2. 如果我在Visual Studio中使用WebDev而不是IIS运行,则虚拟gif文件可以正常呈现.

  3. 在调试模式中VirtualPathProvider.GetFile,我可以看到我的VirtualPathProvider在页面返回404错误之前返回一个完全有效的虚拟gif文件实例...所以我知道我的VirtualPathProvider工作得很好.

注意,当我说IIS时,我并不是说在部署环境中.我只是意味着将项目设置切换为使用IIS而不是WebDev.

有任何想法吗?

谢谢.

asp.net virtualpathprovider iis-7.5

8
推荐指数
1
解决办法
3182
查看次数