パーシャルビューの埋め込みリソースを正常に取得しているカスタム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");
これは部分的な見解ではないと信じる原因は何ですか?
EDIT:I仮想ファイル&の仮想ファイルプロバイダの実装で、このコンポーネントを動作させる上で解決策を探している人のためのコードを投稿しました。この質問は、質問のタイトルに基づいている人にとっても役立ちます。
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());
ありがとうございました。私の唯一の後悔は、私が与えるべき投票を1つだけ持っているということです。 = Pアップ投票ダーリンディミトロフ@この回答 –
私はあなたが私はときに私のdll内のビューとしてこれを治療するためのインテリセンスを奨励するために採用する可能性がトリックを知っていると仮定しないのですか?今のところ、私は私のdllの中に置いたビューでインテリセンスサポートをほとんど持っていません。 –
@MatthewCox、私はビューでIntellisenseについてよく知らないです。私がそれに頼るのをやめたのはずっと前のことです。ファイルに '.cshtml'拡張がある場合、Intellisenseを取得しませんか? –