Странное поведение при загрузке бритвенного вида из пользовательского VirtualPathProvider (ASHX Source)
Я получаю странное поведение, когда загружаю данные через свой пользовательский 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.
Спасибо!
Обновление: изображение сообщения об ошибке
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.