我正在爲Asp.net MVC 2的插件系統工作。我有一個包含控制器和視圖作爲嵌入式資源的DLL。Asp.net MVC VirtualPathProvider視圖解析錯誤
我使用StructureMap掃描控制器的插件DLL,然後我可以將它們拉出並在請求時將它們實例化。這工作正常。然後,我有一個的VirtualPathProvider我改編自this post
public class AssemblyResourceProvider : VirtualPathProvider
{
protected virtual string WidgetDirectory
{
get
{
return "~/bin";
}
}
private bool IsAppResourcePath(string virtualPath)
{
var checkPath = VirtualPathUtility.ToAppRelative(virtualPath);
return checkPath.StartsWith(WidgetDirectory, StringComparison.InvariantCultureIgnoreCase);
}
public override bool FileExists(string virtualPath)
{
return (IsAppResourcePath(virtualPath) || base.FileExists(virtualPath));
}
public override VirtualFile GetFile(string virtualPath)
{
return IsAppResourcePath(virtualPath) ? new AssemblyResourceVirtualFile(virtualPath) : base.GetFile(virtualPath);
}
public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies,
DateTime utcStart)
{
return IsAppResourcePath(virtualPath) ? null : base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
}
}
internal class AssemblyResourceVirtualFile : VirtualFile
{
private readonly string path;
public AssemblyResourceVirtualFile(string virtualPath)
: base(virtualPath)
{
path = VirtualPathUtility.ToAppRelative(virtualPath);
}
public override Stream Open()
{
var parts = path.Split('/');
var resourceName = Path.GetFileName(path);
var apath = HttpContext.Current.Server.MapPath(Path.GetDirectoryName(path));
var assembly = Assembly.LoadFile(apath);
return assembly != null ? assembly.GetManifestResourceStream(assembly.GetManifestResourceNames().SingleOrDefault(s => string.Compare(s, resourceName, true) == 0)) : null;
}
}
的VPP似乎也工作正常。該視圖被發現並被拖入流中。然後我收到一個解析錯誤Could not load type 'System.Web.Mvc.ViewUserControl<dynamic>'.
,在前面任何可插入視圖的例子中我都找不到這個解析錯誤。爲什麼我的觀點在現階段不會編譯?
感謝您的幫助,
伊恩
編輯:
越來越近一個答案,但不是很清楚爲什麼事情沒有編制。基於評論我檢查了版本,一切都在V2中,我相信動態是在V2引入的,所以這很好。我甚至沒有安裝V3,所以它不能這樣。然而,如果我完全刪除了<dynamic>
,我還是有意提交。
因此,一個VPP的作品,但只有當視圖不強類型或動態
這是有道理的,強類型場景的類型是動態加載的DLL,以便在視圖引擎不會意識到這一點,即使該DLL在垃圾箱中。有沒有辦法在應用程序啓動時加載類型?考慮與MEF合作,而不是我定製的Structuremap解決方案。你怎麼看?
您確定您使用的是MVC2嗎?這種類型的「System.Web.Mvc.ViewUserControl」看起來像帶有動態模型的新MVC 3視圖。同時檢查包含嵌入資源的dll是否依賴於MVC 2或3。 –
2010-08-18 13:48:22
這聽起來很像一箇舊的ReSharper錯誤,它會創建損壞的默認視圖。你在用嗎? – bzlm 2010-08-18 16:20:20
@Branislav Abadjimarinov - 見上面的編輯。 @bzlm - 我確實有Resharper,我從來沒有聽說過這個bug,但會感謝。 – madcapnmckay 2010-08-18 20:10:03