aspp.netMVC自定义视图引擎

简介: 采用xslt作为ASP.NETmvc的视图引擎有几个好处 1彻底的实现视图和逻辑的分离(采用ASPX你无法控制别人在ASPX里面是否写逻辑代码) 2彻底的实现强类型的MODEL(自己定义视图引擎只是先一种数据方式) 3借助MODEL序列化为XML,进行XSLT转换,实现页面个性定制 4xsl...

采用xslt作为ASP.NETmvc的视图引擎有几个好处

1彻底的实现视图和逻辑的分离(采用ASPX你无法控制别人在ASPX里面是否写逻辑代码)

2彻底的实现强类型的MODEL(自己定义视图引擎只是先一种数据方式)

3借助MODEL序列化为XML,进行XSLT转换,实现页面个性定制

4xslt的基本语法可以完成一部分JS的工作,而这正是页面基本控件布局和展示所需要的

5xslt的自定义函数可以进行有效的扩展

以前的流不是很了解折腾了一周总算是明白了

 

一个典型的目录如下

QQ截图未命名

文件的结构也是比较清晰的

实现仅需要实现一个借口和集成一个类

代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using System.Web.Routing;

namespace myview
{
    public class MyViewEngine:VirtualPathProviderViewEngine
    {

        private string _AppPath = string.Empty;
        public MyViewEngine()
        {
            ViewLocationFormats = new[]{
                 "/Views/{1}/{0}.aspx"
            };
        }
        protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
        {
            return this.CreateView(controllerContext, partialPath, String.Empty);
        }

        protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
        {
            if (!string.IsNullOrEmpty(masterPath))
                throw new Exception("此处不能指定试图的名称");
            string actionname = controllerContext.RouteData.Values["action"].ToString();
            string controllername = controllerContext.RouteData.Values["controller"].ToString();
            masterPath = string.Format("/Views/Shared/{0}/{1}.xslt",controllername ,actionname); 
            return new xsltView(viewPath, masterPath);
        }
    }
}

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using System.Xml;
using System.IO;
using System.Xml.Xsl;
using System.Web;

namespace myview
{
    public class xsltView:IView
    {

        // 视图文件的物理路径
        private string _viewPhysicalPath;
        // 模板文件的物理路径
        private string _xsltPhysicalPath;

        public xsltView(string viewPhysicalPath, string masterPhysicalPath)
        {
            _viewPhysicalPath = viewPhysicalPath;
            _xsltPhysicalPath = masterPhysicalPath;
        }


        void IView.Render(ViewContext viewContext, System.IO.TextWriter writer)
        {
          

            XslCompiledTransform transform = new XslCompiledTransform();
            //xslt文件的路径
          
            string XsltFileDir =System.Web.HttpContext.Current.Server.MapPath(_xsltPhysicalPath);
            try
            {
                transform.Load(XsltFileDir);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        
          
            MemoryStream fs = new MemoryStream();
           
            XmlReaderSettings redset = new XmlReaderSettings();
            redset.ProhibitDtd = true;
            XsltArgumentList myarg = new XsltArgumentList();
            myarg.AddExtensionObject("myfn:utils", new MyXslExtension());

            System.Xml.Serialization.XmlSerializer xmlser = new System.Xml.Serialization.XmlSerializer(viewContext.ViewData.Model.GetType());
            xmlser.Serialize(fs, viewContext.ViewData.Model);

            fs.Position = 0;
         

            if (string.IsNullOrEmpty(System.Web.HttpContext.Current.Request.Params["debug"]))
            {
                fs.Flush();
            

                MemoryStream stream = new MemoryStream();
                XmlReader viewxmlreader = XmlReader.Create(fs, redset);
                try
                {
                    transform.Transform(viewxmlreader, myarg, stream);
                    viewxmlreader.Close();
                    fs.Close();
                    fs.Dispose();
                  
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                // transform.Transform(Server.MapPath("a.xml"), null, stream);
                stream.Position = 0;
                StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8);
          
                // 呈现出解析后的内容
                writer.Write(reader.ReadToEnd());
                stream.Close();
                reader.Close();
                reader.Dispose();
            }
            else
            {

                StreamReader reader2 = new StreamReader(fs, System.Text.Encoding.UTF8);
                writer.Write(reader2.ReadToEnd());
                fs.Close();
                fs.Dispose();
                reader2.Close();
                reader2.Dispose();
         
               
            }
        }

    }
}

 

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace myview
{
    class MyXslExtension
    {
        public string FormatName(string firstName, string name)
        {
            return name + ", " + firstName;
        }
        public string GetLink()
        {
            return "http://www.cnblogs.com/qqloving/";
        }
    }
}

 

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                 xmlns:utils="myfn:utils"
                exclude-result-prefixes="msxsl">
 
 
  <xsl:output
             method="html"
             encoding="utf-8"
             doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
             doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" omit-xml-declaration="yes" />

    <xsl:template match="/">
      <div style=" border-style:solid; border-width:1px;">
        <table class="style1">
  
              
            <xsl:for-each select="*">
       <tr>
            <td> 0
              <xsl:value-of select="@Name"/>
              <!--一 @表示匹配当前的属性 -->     
            </td>
         <td>1
           <xsl:value-of select="."/>
           <!--一 .表示匹配当前的值 -->
         </td>

         <td>2
           <xsl:value-of select="node()"/>
           <!--一 node()表示获取当前的值 -->
         </td>

         <td>
           3
           <xsl:value-of select="name()"/>
           <!--一 name()表示获取当前节点的名称 -->
         </td>
         <td>
           4
           <xsl:value-of select="utils:GetLink()"/>
           <!--一 name()表示获取当前节点的名称 -->
         </td>
          </tr>
             
              
            </xsl:for-each>
         
              
       
        </table>
      </div>
    </xsl:template>
</xsl:stylesheet>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using System.Xml.Serialization;
namespace MvcApplication5.Models
{


    [Serializable]
    public class ChangePasswordModel
    {
      
        public string OldPassword { get; set; }

     
        public string NewPassword { get; set; }

        
        public string ConfirmPassword { get; set; }
    }
}
 public ActionResult Index()
        {
            ChangePasswordModel MYMODEL = new ChangePasswordModel();
            MYMODEL.ConfirmPassword = "123";
            MYMODEL.NewPassword = "456";
            MYMODEL.OldPassword = "345";

            return View(MYMODEL);
        }
test
相关文章
|
前端开发 JavaScript API
构建可重用用户界面:深入了解组件库的价值与实践
在现代应用程序开发中,组件库已经成为加速开发和提高代码质量的利器。它们是可重用的UI构建块,可以帮助开发者创建一致、漂亮和功能强大的用户界面。本博客将深入研究组件库的核心概念、最佳实践以及为什么它们对于现代开发至关重要。
104 0
|
1月前
|
安全 Java Linux
深入解析Android系统架构及其对开发者的意义####
【10月更文挑战第21天】 本文旨在为读者揭开Android操作系统架构的神秘面纱,探讨其如何塑造现代移动应用开发格局。通过剖析Linux内核、硬件抽象层、运行时环境及应用程序框架等关键组件,揭示Android平台的强大功能与灵活性。文章强调了理解Android架构对于开发者优化应用性能、提升用户体验的重要性,并展望了未来技术趋势下Android的发展方向。 ####
47 0
|
2月前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
65 1
|
2月前
|
存储 SQL 安全
|
3月前
|
前端开发 Android开发 开发者
安卓应用开发中的自定义视图基础
【9月更文挑战第13天】在安卓开发的广阔天地中,自定义视图是一块神奇的画布,它允许开发者将想象力转化为用户界面的创新元素。本文将带你一探究竟,了解如何从零开始构建自定义视图,包括绘图基础、触摸事件处理,以及性能优化的实用技巧。无论你是想提升应用的视觉吸引力,还是追求更流畅的交互体验,这里都有你需要的金钥匙。
|
4月前
|
前端开发 Android开发 开发者
安卓开发中的自定义视图:构建你的第一个控件
【8月更文挑战第26天】在安卓开发的浩瀚海洋中,自定义视图是一块充满魔力的乐土。它不仅是开发者展示创造力的舞台,更是实现独特用户体验的关键。本文将带你步入自定义视图的世界,从基础概念到实战应用,一步步教你如何打造自己的第一个控件。无论你是初学者还是有经验的开发者,这篇文章都将为你的开发之旅增添新的风景。
|
vr&ar 图形学 Windows
CATIA等设计类软件实时渲染流化解决方案
**实时渲染技术可以实现在VR/AR眼镜中查看CATIA模型,其实不仅仅是VR和AR眼镜,还可以是手机、平板、电脑中直接打开网页就可以查看和浏览CATIA等3D模型。而VR/AR眼镜中通过实时渲染技术不仅仅可以查看CATIA模型,其他的比如BIM/Unreal/unity等模型也都是OK的。**那具体是怎么实现的呢?使用起来麻烦吗?能不能支持多人同时使用呢?关于这些对于实时渲染比较相关的问题,这里点量云小芹做统一解释说明。
226 0
CATIA等设计类软件实时渲染流化解决方案
|
Java Android开发
移动应用程序设计基础——Android环境构建与Activity生命周期
安装智能手机开发相关软件平台,并在此基础上测试Activity的生命周期过程。 5、 完成智能手机开发平台安装、以及相关配置; 6、 并实现Hello World; 7、 添加Log日志,通过Log日志验证Ac 1、 安装JAVA JDK 2、 安装Android Studio,熟悉AS的基本操作,改变AS的字体,显示方式;截图和文字说明。 3、 建立新项目,实现Hello World。说明各个文件的作用,以及各个关键语句的作用或含义,给出程序的运行结果。 4、 设置生命周期的Log日志,分别执行相关操作
315 0
移动应用程序设计基础——Android环境构建与Activity生命周期
|
存储 缓存 NoSQL
【Laravel框架】对于Laravel框架架构的研究以及视图方法和内置会话在项目里的运用
【Laravel框架】对于Laravel框架架构的研究以及视图方法和内置会话在项目里的运用
299 0
【Laravel框架】对于Laravel框架架构的研究以及视图方法和内置会话在项目里的运用
|
jenkins 持续交付
项目构建细节1-常用的构建触发器
Jenkins内置4种构建触发器: 触发远程构建 其他工程构建后触发(Build after other projects are build) 定时构建(Build periodically) 轮询SCM(Poll SCM)
项目构建细节1-常用的构建触发器