我在 ASP.NET 4.0 中创建了两个 Web 解决方案,A 和 B。我在解决方案 A 中添加了一个数据输入 Web 表单 (DataEntery.aspx),其中包含第三方用户控件和表单身份验证。
我想在解决方案 B 中重新使用网页DataEntery.aspx。最好的方法是什么?
我在 ASP.NET 4.0 中创建了两个 Web 解决方案,A 和 B。我在解决方案 A 中添加了一个数据输入 Web 表单 (DataEntery.aspx),其中包含第三方用户控件和表单身份验证。
我想在解决方案 B 中重新使用网页DataEntery.aspx。最好的方法是什么?
您可以创建名为解决方案 C 的第三个 Web 应用程序,它将包含具有共享功能的用户控件。在解决方案 A 和 B 中添加对解决方案 C 的引用。
执行此操作的方法之一是将您的 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" />
最好的方法是创建一个包含您的网页的 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);
}
}
}