如何在不同的Web应用程序中重用网页

时间:2012-10-22 09:20:35

标签: asp.net

我在ASP.NET 4.0,A和B中创建了两个Web解决方案。我在解决方案A中添加了一个数据输入Web表单(DataEntery.aspx),其中包含第三方用户控件和表单身份验证。

我想将网页 DataEntery.aspx 重新用于解决方案B.什么是最佳方法?

3 个答案:

答案 0 :(得分:0)

您可以创建一个名为Solution C的第三个Web应用程序,它将保存具有共享功能的用户控件。然后在解决方案A和B中添加对解决方案C的引用。

示例:HOW TO: Share ASP.NET Pages and User Controls Between Applications by Using Visual Basic .NET

答案 1 :(得分:0)

执行此操作的方法之一是将DataEntry.aspx和类后面的代码添加为 Link 到项目中。此外,您需要添加逻辑以将DataEntry.aspx页面从其所在的共享目录复制到将其添加到项目的目录中。您可以通过在项目的PreBuild事件中编写命令行命令或使用以下内容创建CopyLinkedContentFiles.targets文件来执行此操作:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <BuildDependsOn>
            CopyLinkedContentFiles;
            $(BuildDependsOn);
        </BuildDependsOn>
    </PropertyGroup>

    <Target Name="CopyLinkedContentFiles">
        <!-- Remove any old copies of the files -->
        <Delete Condition=" '%(Content.Link)' != '' AND Exists('$(WebProjectOutputDir)\%(Content.Link)') "
                Files="$(WebProjectOutputDir)\%(Content.Link)" />
        <!-- Copy linked content files recursively to the project folder -->
        <Copy Condition=" '%(Content.Link)' != '' " SourceFiles="%(Content.Identity)"
              DestinationFiles="$(WebProjectOutputDir)\%(Content.Link)" />
    </Target>
</Project>

然后将此目标包含在您的项目中,该项目将引用添加为链接的页面。您可以通过将以下行添加到Web应用程序csproj文件:

<Import Project="$(MSBuildProjectDirectory)\[RELATIVE PATH TO FILE]\CopyLinkedContentFiles.targets" />

此行应添加到例如csproj文件中的这一行之后:

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

答案 2 :(得分:0)

最好的方法是创建一个包含网页的dll 您可以引用此dll来获取项目中包含的代码。

您可以使用VirtualFile类加载嵌入在dll中的资源。这是一个例子

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

您需要挂钩应用程序生命周期并注册VirtualPathProvider,以便asp.net知道您正在为虚拟文件提供服务。

  public static class AppStart
  {
    public static void AppInitialize()
    {
      SVirtualPathProvider sampleProvider = new SVirtualPathProvider ();
      HostingEnvironment.RegisterVirtualPathProvider(sampleProvider);
    } 
  }

public class SVirtualPathProvider : VirtualPathProvider
{

    public SVirtualPathProvider() 
    { 

    }

    private bool IsEmbeddedResourcePath(string virtualPath)
    {
        var checkPath = VirtualPathUtility.ToAppRelative(virtualPath);
        return checkPath.StartsWith("~/Succeed.Web/", StringComparison.InvariantCultureIgnoreCase);
    }

    public override bool FileExists(string virtualPath)
    {
        return IsEmbeddedResourcePath(virtualPath) || base.FileExists(virtualPath);
    }

    public override VirtualFile GetFile(string virtualPath)
    {
        if (IsEmbeddedResourcePath(virtualPath))
        {
            return new SVirtualFile(virtualPath);
        }
        else
        {
            return base.GetFile(virtualPath);
        }
    }

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

参见: How to use virtual path providers to dynamically load and compile content from virtual paths