Странное поведение при загрузке Razor View из пользовательского VirtualPathProvider (источник ASHX)

Я получаю странное поведение, когда загружаю данные через свой собственный VirtualPathProvider. Возможно, важно упомянуть, что я пытаюсь использовать это представление в качестве макета.

public class MyVirtualPathProvider : VirtualPathProvider
{
    public MyVirtualPathProvider()
        : base()
    {

    }

    public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) 
    {
        if ((virtualPath.StartsWith("/Path/") ||
            virtualPath.StartsWith("~/Path/")) && virtualPath.EndsWith(".cshtml"))
        {
            String name = virtualPath.Replace("/Path/", "").Replace(".cshtml", "");
            Uri uri = new Uri("http://www.example.com/Handler.ashx?path=" + name);
            return new WebCacheDependency(uri.ToString());
        }

        return base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
    }

    public override bool FileExists(string virtualPath)
    {
        if ((virtualPath.StartsWith("/Path/") || 
            virtualPath.StartsWith("~/Path/")) && virtualPath.EndsWith(".cshtml"))
            return true;

        return base.FileExists(virtualPath);
    }

    public override VirtualFile GetFile(string virtualPath)
    {
        if (virtualPath.StartsWith("/Path/") || virtualPath.StartsWith("~/Path/"))
            return new TemplateVirtualFile(virtualPath);

        return base.GetFile(virtualPath);
    }
}

Я также реализовал пользовательскую (фиктивную) CacheDependency

public class WebCacheDependency : CacheDependency
{
    public WebCacheDependency(String url)
    {
        this.SetUtcLastModified(DateTime.UtcNow);
    }
}

Теперь есть две вещи, которые не работают. Во-первых, все загруженные представления кешируются, а во-вторых, код внутри файла (@Html.ActionLink... и т.д.) не работает, просто выдает ошибку "сборка отсутствует".

Кто-нибудь знает, как решить эти две проблемы?

Решение второй проблемы уже есть (ссылка ), однако я действительно не понимаю, как эту проблему можно решить внутри метода FileExists.

Спасибо!

Обновление: изображение сообщения об ошибке введите здесь описание изображения


person Dänu    schedule 16.07.2011    source источник


Ответы (1)


Правильно ли настроен ваш web.config для Razor? Если вы не укажете pageBaseType для WebViewPage, у вас не будет доступа к ViewBag, поскольку он не относится к базовому типу по умолчанию, WebPageBase.

Ваш web.config должен выглядеть примерно так:

<system.web.webPages.razor>
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    [...]
  </pages>
</system.web.webPages.razor>

Обратите внимание на атрибут pageBaseType. Подробнее здесь: http://msdn.microsoft.com/en-us/library/system.web.webpages.razor.configuration.razorpagessection.pagebasetype(v=vs.99).aspx

По умолчанию значением по умолчанию для PageBaseType является System.Web.WebPages.WebPage.

person Paul Tyng    schedule 16.02.2012