[原创]ASP.NET MVC 使用模板引擎AderTemplateEngine进行视图解析

ASP.NET MVC 使用AderTemplateEngine模板引擎进行视图显示

1. 创建ArtTemplateViewLocator视图文件定位类,代码如下:

namespace ArtLib

{

class ArtTemplateViewLocator : ViewLocator

{

public ArtTemplateViewLocator()

{

base.ViewLocationFormats = new string[] { “~/Views/{1}/{0}.htm”,

“~/Views/{1}/{0}.html”,

“~/Views/Shared/{0}.htm”,

“~/Views/Shared/{0}.html”

};

base.MasterLocationFormats = new string[] { “” };

}

}

}

2. 创建VariableResolver类用于ArtTemplate模板视图解析,并注册自定义组件TagList,代码如下:

namespace ArtLib

{

public static class VariableResolver

{

public static object ArtTemplateResolve(string filePath,IDictionary viewData)

{

//初始化模板引擎

TemplateManager template1 = TemplateManager.FromFile(filePath);

//设置模板数据

template1.SetValue(“ViewData”, viewData);

//注册自定义的标签

template1.RegisterCustomTag(“list”, new TagList());

return template1.Process();

}

}

}

3. 创建ArtTemplateViewEngine类用于处理视图请求,并赋予ViewData给模板引擎,代码如下:

IViewLocator _viewLocator = null;

public IViewLocator ViewLocator

{

get

{

if (this._viewLocator == null)

{

this._viewLocator = new ArtTemplateViewLocator();

}

return this._viewLocator;

}

set

{

this._viewLocator = value;

}

}

public string TemplatePath { get; set; }

#region IViewEngine 成员

public void RenderView(ViewContext viewContext)

{

string viewLocation = ViewLocator.GetViewLocation(viewContext, viewContext.ViewName);

if (string.IsNullOrEmpty(viewLocation))

{

throw new InvalidOperationException(string.Format(“View {0} could not be found.”, viewContext.ViewName));

}

string viewPath = HttpContext.Current.Request.MapPath(viewLocation);

//以下为模板解析

string viewTemplate = VariableResolver.ArtTemplateResolve(viewPath, viewContext.ViewData) as string;

HttpContext.Current.Response.Write(viewTemplate);

}

#endregion

4. 创建ArtTemplateControllerFactory类,用于Golbal.asax进行视图绑定,代码如下:

namespace ArtLib

{

public class ArtTemplateControllerFactory : DefaultControllerFactory

{

protected override IController CreateController(RequestContext requestContext, string controllerName)

{

Controller controller = (Controller)base.CreateController(requestContext, controllerName);

controller.ViewEngine = new ArtTemplateViewEngine();//修改默认的视图引擎为我们刚才创建的视图引擎

return controller;

}

}

}

5. 创建自定义的模板标签类:TagList.cs用于显示数据列表,代码如下:

namespace ArtLib

{

public class TagList : ITagHandler

{

#region ITagHandler 成员

public void TagBeginProcess(TemplateManager manager, Ader.TemplateEngine.Parser.AST.Tag tag, ref bool processInnerElements, ref bool captureInnerContent)

{

processInnerElements = true;

captureInnerContent = true;

}

public void TagEndProcess(TemplateManager manager, Ader.TemplateEngine.Parser.AST.Tag tag, string innerContent)

{

Expression exp;

exp = tag.AttributeValue(“pageSize”);

if (exp == null)

throw new Exception(“Missing attribute: pageSize”);

string pageSize = manager.EvalExpression(exp).ToString();

exp = tag.AttributeValue(“currentPage”);

if (exp == null)

throw new Exception(“Missing attribute: currentPage”);

string currentPage = manager.EvalExpression(exp).ToString();

Business business = new BusinessLogic();

List<InformationSimple> list = new List<InformationSimple>();

if (string.IsNullOrEmpty(pageSize))

{

list = business.Select<InformationSimple>();

}

else

{

Page page = new Page();

page.PageSize = Convert.ToInt32(pageSize);

page.CurrentPage = Convert.ToInt32(currentPage);

list = business.SelectByPage<InformationSimple>(ref page);

}

String html = “”;

foreach (InformationSimple info in list)

{

html = html + “<tr><td>” + info.InfoTitle + “</td></tr>”;

}

html = “<table>” + html + “</table>”;

manager.WriteValue(html);

}

#endregion

}

6. 修改ASP.NET MVC的测试项目的Global.asax文件的Application_Start()方法,加入自定义控制器工厂类:ArtTemplateControllerFactory,代码如下:

protected void Application_Start()

{

ControllerBuilder.Current.SetControllerFactory(typeof(ArtTemplateControllerFactory));

RegisterRoutes(RouteTable.Routes);

}

7. 创建模板文件Views/Home/Index.htm,代码如下:

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml” >

<head>

<title></title>

</head>

<body>

<ad:list pageSize=”10″ currentPage=”1″></ad:list>

#ViewData[“Title”]#

</body>

</html>

8.

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏