Asp.NetMvcカスタムバックエンドテンプレート、書き換えビューエンジン、カスタムビューエンジン
フロントエンドテンプレートライブラリはたくさんありますが、フロントエンドテンプレートは後期再レンダリングで、バックエンドテンプレートはサービス側レンダリングの前に置換操作を実行し、ページのフラッシュ、カスタムバックエンドを避けることができ、バックエンド開発者にも適しています.
Aspについて.NetMvc、バックエンドhtml修正、ビューエンジンでhtmlを修正できます.MVCのデフォルトビューエンジンはRazorView Engineです.RazorView EngineはベースクラスBuildManagerView Engineから継承されています.これには、2つのリロード関数CreatePartialViewとCreateViewがあります.
この2つの関数は、オブジェクトタイプがIViewインタフェースから継承されていることを返します.では、IViewインタフェースから継承すればよいクラスを分類し、RazorViewクラス(ビュークラス)を定義し、RazorViewクラス(RazorViewも実際にはIViewインタフェースから継承されます.RazorViewEngineがデフォルトで使用しているタイプなので、使用するほうがいいです).
RazorViewPlus.cs
ビュークラスRazorView Plusは最終的にはビューエンジンで使用されます.EngineCoreクラスをカスタマイズし、RazorViewクラスから継承します.CreateViewメソッドを書き直します.CreatePartialViewは分割ビューを作成します.一般的に変更する必要はありません.修正後のコード:
最後に、私たちが書き直したビューエンジンを使って、あなたのMVCプロジェクトのディレクトリの下のGlobalを見つけます.asaxファイル、Application_Start関数の一番前に次のコードを追加します.
htmlページコード:
<br> aaaa<br>
最終的にページに出力するhtml:
aaaa
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