我編寫了自定義VirtualFile和VirtualPathProvider實現,這些實現正在成功獲取部分視圖的嵌入式資源。使用自定義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");
是什麼導致它相信這不是局部視圖?
編輯:我發佈我的虛擬文件提供程序實現虛擬文件提供程序實現的代碼,爲任何人誰在這尋找解決方案獲取該組件工作。這個問題對於那些基於問題標題的人來說也是很好的。
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;
}
}
的VirtualPathProvider:
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);
}
}
}
,當然還有,別忘了在你的項目的Global.asax文件來註冊這個新的供應商在Application_Start()事件
System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(new SVirtualPathProvider());
非常感謝。我唯一的遺憾是我只有一個投票權。 = P Up投票回答這個問題 –
@ darin Dimitrov我不認爲你知道我可以用來鼓勵intellisense將它視爲我的dll內的視圖嗎?現在,我對intellisense的支持非常少,我在我的dll –
@MatthewCox中放置了一些視圖,對視圖中的Intellisense我不太瞭解。很久以前,我停止依靠它。如果該文件具有'.cshtml'擴展名,你不會得到Intellisense嗎? –