我在ASP.NET 4.0,A和B中创建了两个Web解决方案。我在解决方案A中添加了一个数据输入Web表单(DataEntery.aspx),其中包含第三方用户控件和表单身份验证。
我想将网页 DataEntery.aspx 重新用于解决方案B.什么是最佳方法?
答案 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