2010-06-17 43 views
3

我想制定一个非常简单的asp.net mvc插件的方法,但主要是我想了解如何查看呈现工程。了解asp.net mvc IView和IView.Render

我蒸馏我的问题到这个

public class CustomView : IView 
{ 
    public void Render(ViewContext viewContext, TextWriter writer) 
    { 
     writer.Write(/* string to render */); 
    } 
} 

现在,写方法中,我可以提供任何字符串的观点,但是,当我把一行代码在那里 包裹<%% >它将代码视为字面而不是解析并执行它。 我试着在字符串的开头添加像<%@Page ...这样的东西,它也只是简单地呈现。

在许多尝试,我现在叫它这样一个控制器的动作中:

... 
CustomView customView = new CustomView(); 

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

我缺少什么或者做错了,这是行不通的? ViewResult在其ViewEngines集合中似乎具有WebFormViewEngine。

我只是想了解这一点,并剥离后,我认为应该是最低限度它不表现我认为应该。我猜测机器的其他部分涉及/缺失,但我无法弄清楚什么。

回答

1

这个<%%>结构被ASP.NET WebForms具体使用。当编译一个基于WebForms的页面(标准的ASP.NET页面或MVC视图)时,它会创建一个新的程序集,其中包含类,编译器将使用这些ASP.NET标记来生成类的各个方面例如在哪里做Response.Write,在哪里导入命名空间等)

你在做什么,直接输出文本作为视图,所以它不会参与编译过程。

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

什么是你特别想实现的,我们也许能够提供建议......

+0

在最基本的层面上,我想使用字符串作为视图。我正在做的事情已经太晚了。我只是想知道什么是正确的点,并尝试插入这样的字符串。 – Harpreet 2010-06-17 15:42:41

-1

微软提供了一些接口,可以解决这个问题;总之:

  • IViewEngine为 '发现' 您的XSLT文件
  • IVIEW提供了一个钩用于执行提供了钩变换

充分肯定:

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

要在磁盘上找到您的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); 
    } 
} 

要连接所有到框架中,修改全局。asax:

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

    AreaRegistration.RegisterAllAreas(); 

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