zoukankan      html  css  js  c++  java
  • ASP.NET MVC 使用AderTemplate模板引擎进行视图显示

    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类用于AdrTemplate模板视图解析,并注册自定义组件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>

  • 相关阅读:
    事务一致性
    面试汇总
    什么是时间复杂度?
    语言为什么都要实例化后才能用 ?实例化后这里东西是放在堆里面还是栈里面?
    LRU 算法——简单的淘汰算法
    Redis为什么可以做到10万的QPS?
    Redis基础
    Redis基于Set如何实现用户关注模型?
    资深技术Leader曹乐:如何成为技术大牛
    对MySQL查询结果进行替换
  • 原文地址:https://www.cnblogs.com/mikel/p/1837716.html
Copyright © 2011-2022 走看看