using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using System.IO;using System.Text.RegularExpressions;namespace MVC{ /**//// <summary> /// 自定义的视图 /// 视图需要继承 IView 接口 /// </summary> public class MyView : IView { // 视图文件的物理路径 private string _viewPhysicalPath; public MyView(string viewPhysicalPath) { _viewPhysicalPath = viewPhysicalPath; } /**//// <summary> /// 实现 IView 接口的 Render() 方法 /// </summary> public void Render(ViewContext viewContext, TextWriter writer) { // 获取视图文件的原始内容 string rawContents = File.ReadAllText(_viewPhysicalPath); // 根据自定义的规则解析原始内容 string parsedContents = Parse(rawContents, viewContext.ViewData); // 呈现出解析后的内容 writer.Write(parsedContents); } public string Parse(string contents, ViewDataDictionary viewData) { // 对 {##} 之间的内容作解析 return Regex.Replace ( contents, @"\{#(. )#\}", // 委托类型 public delegate string MatchEvaluator(Match match) p => GetMatch(p, viewData) ); } protected virtual string GetMatch(Match m, ViewDataDictionary viewData) { if (m.Success) { // 获取匹配后的结果,即 ViewData 中的 key 值,并根据这个 key 值返回 ViewData 中对应的 value string key = m.Result("$1"); if (viewData.ContainsKey(key)) { return viewData[key].ToString(); } } return string.Empty; } }}
view内容:
<html><head> <title>创建自定义的 ViewEngine 的 Demo</title></head><body> <div>name: {#name#}</div> <div>age: {#age#}</div></body></html>
解析结果:name: webabcd
age: 70
评论