繁体   English   中英

使用自定义虚拟路径提供程序动态创建的视图未在MVC 4中呈现

[英]Dynamiclly created views using custom virtual path provider are not being rendered in MVC 4

利用Internet上可用的许多教程和讨论线程,创建了一个poc项目,用于从数据库渲染视图。 代码如下。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Hosting;
using System.Web.Mvc;

namespace WebApplication1
{
    public class MyVirtualPathProvider:VirtualPathProvider
    {
        public override bool FileExists(string virtualPath)
        {
            String view = GetViewFromDatabase(virtualPath);

            if (view == null)
            {
                return base.FileExists(virtualPath);
            }
            else
            {
                return true;
            }
        }

        public override VirtualFile GetFile(string virtualPath)
        {
            String view = GetViewFromDatabase(virtualPath);

            if (view == null)
            {
                return base.GetFile(virtualPath);
            }
            else
            {
                byte[] content = ASCIIEncoding.ASCII.GetBytes(view);
                return new MyVirtualFile(virtualPath, content);
            }
        }

        private String GetViewFromDatabase(string virtualPath)
        {
            if (virtualPath == "/Views/Dynamic/Index.cshtml")
            {
                string strView = @"@model List<String>
                                @{
                                    ViewBag.Title = ""About"";
                                }
                                < h2 > @ViewBag.Title.</ h2 >
                                < h3 > @ViewBag.Message </ h3 >

                                < p > Use this area to provide additional information.</ p >
                                @if(Model != null)
                                {
                                   < ul >
                                       @foreach(String str in Model)
                                    {
                                        < li > @str </ li >
                                    }
                                    </ ul >
                                }";                   
                return strView;
            }
            return null;
        }
    }

    public class MyVirtualFile : VirtualFile
    {
        private byte[] viewContent;

        public MyVirtualFile(string virtualPath, byte[] viewContent)
            : base(virtualPath)
        {
            this.viewContent = viewContent;
        }

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

动作方法如下

public class DynamicController : Controller
{
    // GET: Dynamic
    public ActionResult Index()        
    {
        List<String> _model = new List<string>();
        _model.Add("test1");
        _model.Add("test2");
        _model.Add("test3");
        _model.Add("test4");
        ViewBag.Message = "this mesage is from viewbag";
        ViewBag.Title = "Test view created by Arvin";

        return View("/Views/Dynamic/Index.cshtml", _model);
        //return new FilePathResult("/Views/Dynamic/Index.cshtml", "text/html");

    }
}

也对global.asax文件进行了更改

protected void Application_Start()
{
    HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider()); // my change

    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

当我输入URL https://localhost:[myport_no]/Dynamic/Index ,我得到的是下图

在此处输入图片说明

您可以看到正确显示了突出显示的区域,即模型中传递的数据,但未呈现HTML。 这个问题似乎与其他问题重复,但是我已经遍历了大多数问题以找出确切的问题。 因此,如果您能对此提供见解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM