0

ビューに動的にロードするために使用した次のクラスのセットがあります。以下のコードは、.RenderPartial で呼び出すとうまく機能します。

public class VirtFile:VirtualFile
{
    public VirtFile(string virtualPath) : base(virtualPath)
    {
    }

    public override Stream Open()
    {

        string path = this.VirtualPath;
        Stream str = new MemoryStream();
        StreamWriter writer = new StreamWriter(str);
        writer.Write(@"<%@ Control Language=""C#"" Inherits=""System.Web.Mvc.ViewUserControl"" %>
            <%="Test"%> 

            ");
        writer.Flush();
        str.Position = 0;
        return str;
    }
}
public class Provider:VirtualPathProvider
{
    public override System.Web.Caching.CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)
    {
        return null;
        var dependency = new System.Web.Caching.CacheDependency(virtualPath);
        return dependency;// base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
    }
    public override bool DirectoryExists(string virtualDir)
    {
        if (IsVirtual(virtualDir))
        {
            return true;
        }
        return base.DirectoryExists(virtualDir);
    }
    public override bool FileExists(string virtualPath)
    {
        if (IsVirtual(virtualPath))
        {
            return true;
        }
        return base.FileExists(virtualPath);
    }
    public override VirtualFile GetFile(string virtualPath)
    {

        if(IsVirtual(virtualPath))
        {
            return new VirtFile(virtualPath);                
        }

        return base.GetFile(virtualPath);
    }

    private bool IsVirtual(string virtualPath)
    {
        return virtualPath.Contains("Database");
    }

<%="Test"%>しかし、型付きビューの作成をに変更しようとする<%=new Model.Category()%>と、「型または名前空間名 'Model' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)」というエラーが表示されます。ただし、同じコードを .ascx ファイルに配置するだけで機能します。

<%=AppDomain.CurrentDomain.ApplicationIdentity%>ファイル システムまたはカスタム プロバイダーのいずれかから同じ値を返すため、ストリームがファイル システムまたはカスタム VirtualPathProvider から来ているように見えます。

4

2 に答える 2

1

追加してみる

<%@ Import Namespace="MyApp.Model" %>

動的ユーザー制御文字列に。

編集:

もちろん、型の完全修飾名を に変更Model.Category()して使用することもできますMyApp.Model.Category()。ほとんどの場合、名前空間をインポートします。スタイルの好みだけです。

于 2009-10-29T16:37:37.443 に答える
0

モデルクラスはどのように見えますか? いくつかの名前空間にラップされていますか? VPPは非常に驚くべきことであり、多くの魔法を行うことができます。仮想asp.netの「ページ」コンテンツで「文字列」を渡すときに、クラスへのフルパスを提供することを確認してください。この方法の方が安全です. または、別のオプションとして、web.config を使用して名前空間をリンクし、アプリがクラスを見つけられるようにします。

于 2009-10-29T07:16:49.053 に答える