我正在尝试设计一种制作非常简单的asp.net mvc插件的方法,但我主要是想了解视图渲染是如何工作的。
我已经把我的问题提炼成这样
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。
我只是想要理解这一点,在将它剥离到我认为应该是最低限度之后,它的行为并不像我认为的那样。我猜是机器的其他部分牵扯进来/丢失了,但我不知道是什么。
发布于 2010-06-17 17:52:16
<% %>结构专门由ASP.NET WebForms使用。编译基于WebForms的页面(标准ASP.NET页面或MVC视图)时,它会创建一个包含类的新程序集,编译器使用这些ASP.NET标记生成类的各个方面(例如在哪里执行Response.Write、在哪里导入名称空间等)。
上面所做的是直接将文本作为视图输出,因此它不会参与编译过程。
我能看到它如何与你的上述解决方案一起工作的唯一方式,是在网站中创建一个新的物理.aspx文件,以便它在访问时被编译。
你具体想实现什么,我们也许能提供一些建议……
发布于 2014-06-05 04:12:06
Microsoft提供了一些可以解决此问题的接口;简而言之:
的挂钩
完全归功于:
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);
}
}要将其全部连接到框架中,请修改Global.asax:
protected void Application_Start()
{
ViewEngines.Engines.Add(new XsltViewEngine());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}https://stackoverflow.com/questions/3058880
复制相似问题