ASP.NET MVCカスタムビューエンジン

8478 ワード

最近仕事の関係で、プロジェクトのASP.NETmvcビューエンジンはxsltで、会社の当然なのは异常な强大さと丈夫さで、どのように私のXSLTはあまり熟知していないで、少なくともhtmlを思っているように熟知していないで、だからプライベートの下で自分で练习して先に简単なビューエンジンをして、なぜXSLTを使うのかについては、自然にxslt+xml黙认の解析も异常な强大さと丈夫さで、またプロジェクトのためにコンポーネント化、分布式、マルチスレッドの同时などの基础を筑くことができます
カスタム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つの多いです