ASP.NET MVCカスタムビューエンジン
8478 ワード
最近仕事の関係で、プロジェクトのASP.NETmvcビューエンジンはxsltで、会社の当然なのは异常な强大さと丈夫さで、どのように私のXSLTはあまり熟知していないで、少なくともhtmlを思っているように熟知していないで、だからプライベートの下で自分で练习して先に简単なビューエンジンをして、なぜXSLTを使うのかについては、自然にxslt+xml黙认の解析も异常な强大さと丈夫さで、またプロジェクトのためにコンポーネント化、分布式、マルチスレッドの同时などの基础を筑くことができます
カスタムASP.NETMVCビューエンジンは、インタフェースIViewを実装し、VirtualPathProviderViewEngineを継承するだけです.
VirtualPathProviderViewEngineを書き換える際の主な目的は、リクエストとビューとテンプレートビューのファイルパスとタイプを指定することです.
たとえば
===
==
ViewLocationFormatでは主にビューのファイルパスであるが、XML(メモリ生成)+xslt(解析変換を担当)を採用するため、要求のタイプはASPを採用しない.NETmvcデフォルト
「/Views/{1}/{0}.aspx」でいい、xsltをテンプレートにすればいい
率直に言ってASP.NETmvcメカニズムはよく知られておらず、IView CreateView(ControllerContext controller Context,string viewPath,string masterPath)に葛藤し始めた.
中masterPathのパスはどのようにずっと空で、配置に問題があるのか、それとも論理に問題があるのか、午前中悩んで、最終的にASPをダウンロードしました.NETmvcソースコードを確認してください.ここにはテンプレートを探すための他の関数があります.
GetPath(controllerContext, MasterLocationFormats, "MasterLocationFormats", //masterName, controllerName, _cacheKeyPrefix_Master, useCache, out masterLocationsSearched)
だからいっそ自分でテンプレートを探して、強制的なパスにもなりますmasterPath=string.Format("/Views/Shared/{0}.xslt", actionname);
これでいい
テンプレートエンジンは独自のIViewを実現し、テンプレートを解析する必要がある.
===
===
ここでは主にxmlを呼び出す方法で変換し、直接出力します.
最後にもう一つやるべきことがある.
==================================
ここでビューエンジンを初期化すればいいです
もっと簡単に使えます
===
それから自分でかまどを開けてxsltと具体的なASPを研究しなければなりません.NETmvcフレームはJAVAのMVCフレームと比較して、以前はasp.Netはオープンソースがなくていつも人に軽蔑されて底層が分からないで、今この歴史はついに過ぎて、XMLがメモリの中で生成するため、とても良い練習の以前linq to xml、本当に1つの多いです
カスタムASP.NETMVCビューエンジンは、インタフェースIViewを実装し、VirtualPathProviderViewEngineを継承するだけです.
VirtualPathProviderViewEngineを書き換える際の主な目的は、リクエストとビューとテンプレートビューのファイルパスとタイプを指定することです.
たとえば
===
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using System.Web.Routing;
namespace myview
{
public class MyViewEngine:VirtualPathProviderViewEngine
{
private string _AppPath = string.Empty;
//#region Properties
//public static FileSystemTemplateLoader Loader { get; private set; }
//public static StringTemplateGroup Group { get; private set; }
//#endregion
public MyViewEngine()
{
ViewLocationFormats = new[]{
"/Views/{1}/{0}.aspx"
};
}
protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
{
return this.CreateView(controllerContext, partialPath, String.Empty);
}
protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
{
//
// string masterPath =GetPath(controllerContext, MasterLocationFormats, "MasterLocationFormats",
//masterName, controllerName, _cacheKeyPrefix_Master, useCache, out masterLocationsSearched);
//base.FindView(controllerContext, viewPath, masterPath, true);
//string controllername = controllerContext.RouteData.Values["controller"].ToString();
///Views/Shared/{0}.xslt
if (!string.IsNullOrEmpty(masterPath))
throw new Exception(" ");
string actionname = controllerContext.RouteData.Values["action"].ToString();
masterPath = string.Format("/Views/Shared/{0}.xslt", actionname);
return new xsltView(viewPath, masterPath);
}
}
}
==
ViewLocationFormatでは主にビューのファイルパスであるが、XML(メモリ生成)+xslt(解析変換を担当)を採用するため、要求のタイプはASPを採用しない.NETmvcデフォルト
「/Views/{1}/{0}.aspx」でいい、xsltをテンプレートにすればいい
率直に言ってASP.NETmvcメカニズムはよく知られておらず、IView CreateView(ControllerContext controller Context,string viewPath,string masterPath)に葛藤し始めた.
中masterPathのパスはどのようにずっと空で、配置に問題があるのか、それとも論理に問題があるのか、午前中悩んで、最終的にASPをダウンロードしました.NETmvcソースコードを確認してください.ここにはテンプレートを探すための他の関数があります.
GetPath(controllerContext, MasterLocationFormats, "MasterLocationFormats", //masterName, controllerName, _cacheKeyPrefix_Master, useCache, out masterLocationsSearched)
だからいっそ自分でテンプレートを探して、強制的なパスにもなりますmasterPath=string.Format("/Views/Shared/{0}.xslt", actionname);
これでいい
テンプレートエンジンは独自のIViewを実現し、テンプレートを解析する必要がある.
===
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using System.Xml;
using System.IO;
using System.Xml.Xsl;
using System.Web;
namespace myview
{
public class xsltView:IView
{
//
private string _viewPhysicalPath;
//
private string _xsltPhysicalPath;
public xsltView(string viewPhysicalPath, string masterPhysicalPath)
{
_viewPhysicalPath = viewPhysicalPath;
_xsltPhysicalPath = masterPhysicalPath;
}
void IView.Render(ViewContext viewContext, System.IO.TextWriter writer)
{
XslCompiledTransform transform = new XslCompiledTransform();
//xslt
string XsltFileDir =System.Web.HttpContext.Current.Server.MapPath(_xsltPhysicalPath);
try
{
transform.Load(XsltFileDir);
}
catch (Exception ex)
{
throw ex;
}
MemoryStream stream = new MemoryStream();
if (string.IsNullOrEmpty(System.Web.HttpContext.Current.Request.Params["debug"]))
{
try
{
transform.Transform(XmlReader.Create(new StringReader(viewContext.ViewData["xmlcontent"].ToString())), null, stream);
}
catch (Exception ex)
{
throw ex;
}
// transform.Transform(Server.MapPath("a.xml"), null, stream);
stream.Position = 0;
StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8);
//
writer.Write(reader.ReadToEnd());
}
else
{
writer.Write(viewContext.ViewData["xmlcontent"].ToString());
}
}
}
}
===
ここでは主にxmlを呼び出す方法で変換し、直接出力します.
最後にもう一つやるべきことがある.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using myview;
namespace MvcApplication5
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
"Default2", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new myview.MyViewEngine());
}
}
}
==================================
ここでビューエンジンを初期化すればいいです
もっと簡単に使えます
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcApplication5.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC!";
ViewData["xmlcontent"] = @"<result>
<h1>
aaa
</h1>
</result>";
return View();
}
public ActionResult About()
{
return View();
}
}
}
===
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="html" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="/result">
<xsl:for-each select="h1">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
それから自分でかまどを開けてxsltと具体的なASPを研究しなければなりません.NETmvcフレームはJAVAのMVCフレームと比較して、以前はasp.Netはオープンソースがなくていつも人に軽蔑されて底層が分からないで、今この歴史はついに過ぎて、XMLがメモリの中で生成するため、とても良い練習の以前linq to xml、本当に1つの多いです