2013-03-11 2 views
2

Я прочитал десятки связанных потоков и сделал мой очень простой виртуальный провайдер из образцов.Есть ли какой-либо рабочий образец VirtualPathProvider в бритве mvc4?

Но он не отображает поток виртуальных файлов. просто отображая текст плана.

Вот выход.

@inherits System.Web.Mvc.WebViewPage 
@{ViewBag.Title = "Hellow World !";} 
<h2>Hellow World !</h2> 

Там связаны темы об этом, но они не говорят, как они решили его или решение не работает. Я не могу найти, что я ошибся.

и есть намного больше ...

Что случилось?

Вот мой тестовый код. (Global.asax и это все, что я изменил.)

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(
      new MyProvider()); 

     AreaRegistration.RegisterAllAreas(); 

     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
     AuthConfig.RegisterAuth(); 
    } 
} 

public class MyProvider : VirtualPathProvider 
{ 
    public override bool FileExists(string virtualPath) 
    { 
     if (Previous.FileExists(virtualPath)) 
      return true; 
     else 
      // ~/Infra is the test url 
      return virtualPath.StartsWith("/Infra") || virtualPath.StartsWith("~/Infra"); 
    } 

    public override VirtualFile GetFile(string virtualPath) 
    { 
     if (Previous.FileExists(virtualPath)) 
      return base.GetFile(virtualPath); 
     else 
      return new MyVirtualFile(virtualPath); 
    } 

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

     public override Stream Open() 
     { 
      //Loading stream from seperate dll shows just plain text 
      //System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFile(
      // System.IO.Path.Combine(HttpRuntime.BinDirectory, "Infra.dll")); 
      //return assembly.GetManifestResourceStream("Infra.Views.Home.Index.cshtml"); 

      //Changed to string but also it shows plain text. 
      return new System.IO.MemoryStream(System.Text.ASCIIEncoding.UTF8.GetBytes(
       "@inherits System.Web.Mvc.WebViewPage \r\n <h2>Hellow World !</h2>")); 
     } 
    } 
} 

ответ

2

Я вижу этот вопрос немного старый, но я только столкнулся с той же ошибкой. Я считаю, что проблема заключается в тестовом URL. У меня нет времени, чтобы полностью исследовать, но я думаю, что, если только указанный URL не находится в ожидаемом формате (механизм просмотра ASP.NET MVC основан на соглашениях), то он может не использовать бритву в качестве механизма просмотра; Я не уверен, если это является причиной, но некоторые примеры с использованием строки «Инфра» вы используете:

Новый MVC 4 проекта в домашнем контроллере:

public ActionResult Index() 
{ 
    ViewBag.Message = "Welcome to ASP.NET MVC!"; 

    dynamic x = new ExpandoObject(); 

    return View("Infra-test.cshtml", x); 
} 

Это вызывает в:

private bool IsPathVirtual(string virtualPath) 

с virtualPath установлен на '/Views/Home/Infra-test.cshtml.aspx'. Он добавил расширение aspx на конец, что заставляет меня думать, что не использует бритву для компиляции представления. Небольшая модификация для виртуального провайдера пути будет видеть ссылки ниже работы:

public override bool FileExists(string virtualPath) 
{ 
    if (Previous.FileExists(virtualPath)) 
     return true; 
    else 
     // prevent view start compilation errors 
     return virtualPath.StartsWith("/Infra") && !virtualPath.Contains("_ViewStart"); 
} 

URL, который будет работать:

return View("/Infra/test.cshtml", x); 
return View("/Infra/one/test.cshtml", x); 
return View("/Infra/one/two/test.cshtml", x); 

они не работают:

return View("/Infra", x); 
return View("/Infra/test", x); 

Для образца вам также понадобится реализовать GetCacheDependency; в противном случае он будет генерировать исключение, если ему не удается найти файл для виртуального пути на диске, ниже приведен простой пример. Прочтите документы для правильной реализации.

private bool IsVirtualPath(string virtualPath) 
{ 
    return virtualPath.StartsWith("/Infra") && !virtualPath.Contains("_ViewStart"); 
} 

public override CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart) 
{ 
    if (IsVirtualPath(virtualPath)) 
     return null; 

    return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart); 
} 
+1

Помните, что после каждого изменения или настройки помните RESTART IIS Express, потому что он кэширует местоположения, файлы и, по-видимому, результаты, хотя я не задал его и все такое. Я ударился головой, а затем после перезапуска IIS понял, что все это работает без существующего имени файла, без его встроенного ресурса, если у него есть «.cshtml», и я уверен, что я тоже переустановил его. Чему вы помогли мне частично создать мои решения. Уф! – ppumkin

 Смежные вопросы

  • Нет связанных вопросов^_^