首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解asp.net、mvc、IView和IView.Render

了解asp.net、mvc、IView和IView.Render
EN

Stack Overflow用户
提问于 2010-06-17 12:29:22
回答 2查看 5.2K关注 0票数 3

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

我已经把我的问题提炼成这样

代码语言:javascript
复制
public class CustomView : IView
{
    public void Render(ViewContext viewContext, TextWriter writer)
    {
        writer.Write( /* string to render */);
    }
}

现在,在写方法中,我可以将任何字符串呈现给视图,但是当我在其中放入一行用<% %>包装的代码时,它会按字面意思将代码呈现给视图,而不是解析并执行它。我已经尝试添加类似<% @Page ...到字符串的开头,它也会逐字呈现出来。

在许多尝试中,我目前在控制器操作中这样调用它:

代码语言:javascript
复制
...
CustomView customView = new CustomView();

ViewResult result = new ViewResult();
result.View = customView;
result.ViewName = "Index.aspx";
result.MasterName = "";
return result;

我遗漏了什么,或者做错了什么,这不会起作用?ViewResult的ViewEngines集合中似乎有WebFormViewEngine。

我只是想要理解这一点,在将它剥离到我认为应该是最低限度之后,它的行为并不像我认为的那样。我猜是机器的其他部分牵扯进来/丢失了,但我不知道是什么。

EN

回答 2

Stack Overflow用户

发布于 2010-06-17 17:52:16

<% %>结构专门由ASP.NET WebForms使用。编译基于WebForms的页面(标准ASP.NET页面或MVC视图)时,它会创建一个包含类的新程序集,编译器使用这些ASP.NET标记生成类的各个方面(例如在哪里执行Response.Write、在哪里导入名称空间等)。

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

我能看到它如何与你的上述解决方案一起工作的唯一方式,是在网站中创建一个新的物理.aspx文件,以便它在访问时被编译。

你具体想实现什么,我们也许能提供一些建议……

票数 1
EN

Stack Overflow用户

发布于 2014-06-05 04:12:06

Microsoft提供了一些可以解决此问题的接口;简而言之:

  • IViewEngine提供用于“查找”XSLT的挂钩
  • IView提供用于执行转换

的挂钩

完全归功于:

http://www.codeproject.com/Articles/426768/Implementing-an-XSLT-View-Engine-for-ASP-NET-MVC

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

代码语言:javascript
复制
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);
    }
}

要转换您的数据:

代码语言:javascript
复制
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:

代码语言:javascript
复制
protected void Application_Start()
{
    ViewEngines.Engines.Add(new XsltViewEngine());

    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3058880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档