Проблемы с ссылками при использовании VirtualPathProvider для динамической загрузки представления - PullRequest
0 голосов
/ 29 октября 2009

У меня есть следующий набор классов, которые я использовал для динамической загрузки в View. Приведенный ниже код хорошо работает при вызове с помощью .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()%> создания типизированного представления, я получаю сообщение об ошибке, в котором говорится, что «Тип или имя пространства имен« Модель »не может быть найдено (вы пропустили директиву using или ссылка на сборку?) ". Однако тот же код работает, если он просто помещен в файл .ascx.

Я что-то упустил, похоже, что если поток идет из файловой системы или пользовательского VirtualPathProvider, он должен иметь те же загруженные сборки, поскольку <%=AppDomain.CurrentDomain.ApplicationIdentity%> возвращает то же значение из файловой системы или из пользовательского провайдера. 1009 *

Ответы [ 2 ]

1 голос
/ 29 октября 2009

Попробуйте добавить

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

в вашу динамическую строку управления пользователем.

EDIT:

Конечно, вы также можете использовать полное имя для типа, изменив Model.Category() на MyApp.Model.Category(). Большую часть времени я импортирую пространство имен. Просто стиль предпочтения.

0 голосов
/ 29 октября 2009

Как выглядит ваш класс Model? Он заключен в какое-то пространство имен? VPP - это удивительная вещь, и он может творить много магии, просто убедитесь, что когда вы передаете 'string' со своим контентом 'asp.net' page ', вы предоставляете полный путь к своим классам, это безопаснее. или, еще один вариант, используйте ваш web.config для связи ваших пространств имен, чтобы приложение могло найти ваши классы.

...