Asp.net mvc 了解asp.net mvc IView和IView.Render

Asp.net mvc 了解asp.net mvc IView和IView.Render,asp.net-mvc,Asp.net Mvc,我试图设计一种方法来制作非常简单的asp.net mvc插件,但主要是想了解视图渲染是如何工作的 我把我的问题归结到这一点 public class CustomView : IView { public void Render(ViewContext viewContext, TextWriter writer) { writer.Write( /* string to render */); } } 现在,在这个write方法中,我可以将任何字符串呈

我试图设计一种方法来制作非常简单的asp.net mvc插件,但主要是想了解视图渲染是如何工作的

我把我的问题归结到这一点

public class CustomView : IView
{
    public void Render(ViewContext viewContext, TextWriter writer)
    {
        writer.Write( /* string to render */);
    }
}
现在,在这个write方法中,我可以将任何字符串呈现给视图,但是当我在其中放入一行代码时 用它包装的代码将按字面形式呈现给视图,而不是解析和执行它。 我已经尝试添加了一些东西,如ASP.NET WebForms专门使用的结构。当编译基于WebForms的页面(标准ASP.NET页面或MVC视图)时,它将创建一个包含类的新程序集,编译器将使用这些ASP.NET标记生成类的各个方面(例如在何处执行响应.写入,在何处导入命名空间等)

上面所做的是直接将文本作为视图输出,因此它不会参与编译过程

我能看到它如何与上述解决方案配合使用的唯一方法是在网站中创建一个新的物理.aspx文件,以便在访问时对其进行编译


您具体想要实现什么,我们可以提供建议…

Microsoft提供了一些可以解决此问题的界面;简言之:

  • iVieEngine为“查找”XSLT提供了一个钩子
  • IView提供了一个执行转换的钩子
完全归功于:

要在磁盘上查找XSLT,请执行以下操作:

public class XsltViewEngine : VirtualPathProviderViewEngine
{
    public XsltViewEngine()
    {
        ViewLocationFormats = new[] 
            { 
                "~/XSLTs/{1}/{0}.xsl", "~/XSLTs/Shared/{0}.xsl", 
                "~/XSLTs/{1}/{0}.xslt", "~/XSLTs/Shared/{0}.xslt" 
            };
        PartialViewLocationFormats = ViewLocationFormats;
    }

    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
    {
        return new XsltView(partialPath);
    }

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
    {
        return new XsltView(viewPath);
    }
}
要转换数据,请执行以下操作:

public class XsltView : IView
{
    private readonly string _path;

    public XsltView(string path)
    {
        _path = path;
    }

    public void Render(ViewContext viewContext, TextWriter writer)
    {
        var xsltFile = viewContext.HttpContext.Server.MapPath(_path);
        var xmlData = viewContext.ViewData["data"] != null 
            ? ((XElement)viewContext.ViewData["data"]).ToString() 
            : "";

        var xmlTree = XDocument.Parse(xmlData);
        var xslt = new XslCompiledTransform();

        xslt.Load(xsltFile);
        xslt.Transform(xmlTree.CreateReader(), null, writer);
    }
}
要将其全部连接到框架中,请修改Global.asax:

protected void Application_Start()
{
    ViewEngines.Engines.Add(new XsltViewEngine());

    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}

在最基本的层面上,我希望使用字符串作为视图。我在上面所做的已经太晚了。我只是想知道什么是正确的点,点击并尝试插入这样一个字符串。
protected void Application_Start()
{
    ViewEngines.Engines.Add(new XsltViewEngine());

    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}