Asp.NetMvcカスタムバックエンドテンプレート、書き換えビューエンジン、カスタムビューエンジン


フロントエンドテンプレートライブラリはたくさんありますが、フロントエンドテンプレートは後期再レンダリングで、バックエンドテンプレートはサービス側レンダリングの前に置換操作を実行し、ページのフラッシュ、カスタムバックエンドを避けることができ、バックエンド開発者にも適しています.
Aspについて.NetMvc、バックエンドhtml修正、ビューエンジンでhtmlを修正できます.MVCのデフォルトビューエンジンはRazorView Engineです.RazorView EngineはベースクラスBuildManagerView Engineから継承されています.これには、2つのリロード関数CreatePartialViewとCreateViewがあります.
#region     System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// D:\development\WebMvc\SecurityDemo\packages\Microsoft.AspNet.Mvc.5.2.3\lib
et45\System.Web.Mvc.dll #endregion namespace System.Web.Mvc { // // : // ASP.NET Razor 。 public class RazorViewEngine : BuildManagerViewEngine { // // : // System.Web.Mvc.RazorViewEngine 。 public RazorViewEngine(); // // : // System.Web.Mvc.RazorViewEngine 。 // // : // viewPageActivator: // 。 public RazorViewEngine(IViewPageActivator viewPageActivator); // // : // 。 // // : // controllerContext: // 。 // // partialPath: // 。 // // : // 。 protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath); // // : // 。 // // : // controllerContext: // 。 // // viewPath: // 。 // // masterPath: // 。 // // : // 。 protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath); } }

この2つの関数は、オブジェクトタイプがIViewインタフェースから継承されていることを返します.では、IViewインタフェースから継承すればよいクラスを分類し、RazorViewクラス(ビュークラス)を定義し、RazorViewクラス(RazorViewも実際にはIViewインタフェースから継承されます.RazorViewEngineがデフォルトで使用しているタイプなので、使用するほうがいいです).
RazorViewPlus.cs
using Microsoft.Ajax.Utilities;
using Microsoft.VisualBasic;
using RazorEnginePlus.Extend;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Web.Mvc;
using System.Web.UI;

namespace RazorEnginePlus
{
    public class RazorViewPlus : RazorView
    {
     
        public RazorViewPlus(ControllerContext controllerContext, string viewPath, string layoutPath, bool runViewStartPages, IEnumerable viewStartFileExtensions) : base(controllerContext, viewPath, layoutPath, runViewStartPages, viewStartFileExtensions)
        {
        }

        public RazorViewPlus(ControllerContext controllerContext, string viewPath, string layoutPath, bool runViewStartPages, IEnumerable viewStartFileExtensions, IViewPageActivator viewPageActivator) : base(controllerContext, viewPath, layoutPath, runViewStartPages, viewStartFileExtensions, viewPageActivator)
        {
        }
    
        protected override void RenderView(ViewContext viewContext, TextWriter writer, object instance)
        {
            StringWriter stringWriter = new StringWriter();
            HtmlTextWriter tw = new HtmlTextWriter(stringWriter);
            base.RenderView(viewContext, tw, instance);
            string html = stringWriter.ToString();
        
            //    
            Regex regx = new Regex("[\\s\\S]*?", RegexOptions.IgnoreCase);
            MatchCollection matchList = regx.Matches(html); //       
            for (int i = 0; i < matchList.Count; i++) {
                var ls_tmpl = matchList[i].Value;
                if (!string.IsNullOrEmpty(ls_tmpl)) {
                    var ls_id = "";
                    Regex regxtmplid = new Regex("\\s+?id\\s*?=\\s*?\"\\s*?[\\S]+?\\s*?\"", RegexOptions.IgnoreCase);
                    MatchCollection matchTmplId = regxtmplid.Matches(ls_tmpl);
                    if (matchTmplId.Count > 0) {
                        ls_id = matchTmplId[0].Value;
                        if (!string.IsNullOrEmpty(ls_id)) {
                            ls_id = new Regex("[\\s\\S]*?\\s+?id\\s*?=\\s*?\"", RegexOptions.IgnoreCase).Replace(ls_id, "");
                            ls_id = ls_id.Replace(" ", "").Replace("\"", "");
                        }

                        //         
                        if (!string.IsNullOrEmpty(ls_id)) {
                            Regex regxPartial = new Regex("[\\s\\S]*?", RegexOptions.IgnoreCase);
                            MatchCollection matchScriptTmpl = regxPartial.Matches(html);
                            if (matchScriptTmpl.Count <= 0) {
                                regxPartial = new Regex("[\\s\\S]*?", RegexOptions.IgnoreCase);
                                matchScriptTmpl = regxPartial.Matches(html);
                            }
                            if (matchScriptTmpl.Count > 0) {
                                var ls_partial = matchScriptTmpl[0].Value;
                                Regex regxPartialRp1 = new Regex("", RegexOptions.IgnoreCase);
                                Regex regxPartialRp2 = new Regex("", RegexOptions.IgnoreCase);
                                ls_partial = regxPartialRp1.Replace(ls_partial, "");
                                ls_partial = regxPartialRp2.Replace(ls_partial, "");


                                Regex regxTag = new Regex("[\\s\\S]*?", RegexOptions.IgnoreCase);
                                html = regxTag.Replace(html, ls_partial);

                            }
                        }
                    }
                }
            }


            //      
            Regex regTmplRemove1 = new Regex("[\\s\\S]*?", RegexOptions.IgnoreCase);
            html = regTmplRemove1.Replace(html, "");
            Regex regTmplRemove2 = new Regex("[\\s\\S]*?", RegexOptions.IgnoreCase);
            html = regTmplRemove2.Replace(html, "");

            //     
            writer.Write(html);
        }
    }
}

ビュークラスRazorView Plusは最終的にはビューエンジンで使用されます.EngineCoreクラスをカスタマイズし、RazorViewクラスから継承します.CreateViewメソッドを書き直します.CreatePartialViewは分割ビューを作成します.一般的に変更する必要はありません.修正後のコード:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc;

namespace RazorEnginePlus
{
    public class EngineCore : RazorViewEngine
    {
        protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
        {
            return base.CreateView(controllerContext, partialPath, string.Empty);
        }
        /// 
        ///               IView      
        /// 
        protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
        {
            //var physicalPath = controllerContext.HttpContext.Server.MapPath(viewPath);
            //return new BaseView(physicalPath);
            return new RazorViewPlus(controllerContext, viewPath, masterPath, true, base.FileExtensions, base.ViewPageActivator);
            //return base.CreateView(controllerContext, viewPath, masterPath);
        }
    }
}

最後に、私たちが書き直したビューエンジンを使って、あなたのMVCプロジェクトのディレクトリの下のGlobalを見つけます.asaxファイル、Application_Start関数の一番前に次のコードを追加します.
//        
            var orgRazorEngine = ViewEngines.Engines.SingleOrDefault(ve => ve is RazorViewEngine);
            if (orgRazorEngine != null)
            {
                ViewEngines.Engines.Remove(orgRazorEngine);
            }
            //          
            //ViewEngines.Engines.Clear();
            //                
            ViewEngines.Engines.Add(new EngineCore());

htmlページコード:
 
        <br>             aaaa<br>        
最終的にページに出力するhtml:
aaaa