1

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

我想在解决方案 B 中重新使用网页DataEntery.aspx。最好的方法是什么?

4

3 回答 3

0

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

示例:如何:使用 Visual Basic .NET 在应用程序之间共享 ASP.NET 页面和用户控件

于 2012-10-22T10:24:36.737 回答
0

执行此操作的方法之一是将您的 DataEntry.aspx 和类后面的代码作为链接添加到您的项目。此外,您将需要添加逻辑以将 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" />
于 2012-10-22T10:25:18.993 回答
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);
        }
    }
}

参考: 如何使用虚拟路径提供程序从虚拟路径动态加载和编译内容

于 2012-10-23T04:22:46.710 回答