Come caricare una vista HTML diversa da un file di visualizzazione MVC?

 C Programming >> Programmazione C >  >> Tags >> File
Come caricare una vista HTML diversa da un file di visualizzazione MVC?

Ti sei mai chiesto se fosse possibile visualizzare del contenuto HTML in un'applicazione ASP.NET MVC, utilizzando un modo diverso rispetto a una tradizionale visualizzazione MVC? Questo articolo tratterà esattamente questo.

Il principio è cortocircuitare il meccanismo di risoluzione delle visualizzazioni.

Passaggio 1:sovrascrivi la classe "VirtualPathProvider"

Sostituiremo "FileExists" e "GetFile" metodi e quindi creare filtri che rileveranno le visualizzazioni in cortocircuito.

In questo esempio, ho creato un membro privato "filtri" che definisce l'elenco delle visualizzazioni che vogliamo "catturare" e caricarle in un altro modo.

Quindi, sostituiamo "FileExists" e "GetFile" metodi per catturare i nostri filtri.

È necessario simulare un percorso "reale" per le nostre visualizzazioni che vogliamo catturare, ecco cosa "PathFormatter" lo farà.

Infine, "GetViewBytesData" caricherà il contenuto in cortocircuito e lo invierà a un'altra classe sovrascritta :"CustomVirtualFile".

Puoi implementare questo metodo a tuo piacimento e caricare viste diverse da qualsiasi luogo (file flat, servizio web, database...)

public class CustomVirtualPathProvider : VirtualPathProvider 
    {
        private static List filters = new List()
        {
            PathFormatter("PhantomView")
        };
               
        public override bool FileExists(string virtualPath)
        {
            if (!filters.Contains(virtualPath))
                return base.FileExists(virtualPath);
            return true;
        }
      
         public override VirtualFile GetFile(string virtualPath)
         {
            if(!filters.Contains(virtualPath))
                return base.GetFile(virtualPath);
            return new CustomVirtualFile(virtualPath, GetViewBytesData());
        }
       
        private byte[] GetViewBytesData()
        {
            string htmlBody = @"@{ Layout = null;}
                        <hgroup>  
                            <h1>@ViewBag.Title</h1>
                            <h2>@ViewBag.Message</h2>
 
                            <div>Message:      @Model.Message         </div>
                        </hgroup>";
            return Encoding.ASCII.GetBytes(htmlBody);
        }

        public static string PathFormatter(string viewName)
        {
            return string.Format(@"/Views/Shared/{0}.cshtml",viewName);
        }
    }

Passaggio 2:implementa una classe VirtualFile personalizzata derivata dalla classe astratta "VirtualFile"

Implementando i metodi "Open", questa classe ti consente di iniettare contenuto da qualsiasi luogo invece del classico approccio di visualizzazione MVC:

public class CustomVirtualFile : VirtualFile
    {
        private readonly byte[] _data;

        public CustomVirtualFile(string virtualPath, byte[] data)
            : base(virtualPath)
        {
            _data = data;
        }

        public override Stream Open()
        {
            return new MemoryStream(_data);
        }
    }

Fase 3:registra il nostro VirtualPathProvider nel file Global.asax

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            HostingEnvironment.RegisterVirtualPathProvider(new CustomVirtualPathProvider());
        }

Fase 4:crea la cartella "Condivisa" se non esiste (per impostazione predefinita, dovrebbe essere creata automaticamente quando crei un nuovo progetto MVC)

Passaggio 5:crea un controller e un'azione che visualizzi una vista "falsa"

public class PhantomController : Controller
    {
        public ActionResult Index()
        {
            ViewData["Title"] = "The phantom view";
            ViewBag.Message = "Welcome into the phantom view!!!!";

            var model = new PhantomModel
            {
                Message = "Ouuuuh I don't exist!"
            };

            return View(CustomVirtualPathProvider.PathFormatter("PhantomView"), model);
        }
    }

Come puoi vedere, sto usando un modello classico, ViewBag e ViewData.

Ricorda, il contenuto della nostra vista "falsa" è definito in "GetViewBytesData" al passaggio 1

Passaggio 6:provalo!

Divertente non è vero? 🙂