一、背景

  在asp.net mvc项目里,用户需要开拓几个活动版面,并以侧栏的方式呈现在首页右侧,几个活动时间不一致,为避免浏览者在活动未开放之时进入未开放的服务页面。因此不仅需要在活动代码中加入限制功能,也需要在前台取消不合时宜的页面的展示。后台效果图:

二、问题分析

  要想控制页面开关显示,就得有存储开关信息的介质,将在后台产生的操作记录下来,并在浏览者加载首页之时能读取操作记录并达到控制页面开关的目的。因此,考虑两种介质储存开关记录信息,一是用数据库mysql,二是用xml。考虑到这对数据库的功能大材小用,并且会增加首页加载时对数据库资源消耗,所以考虑使用xml文档来记录开关记录才是两者中较好的选择。这里需要我们做一下前期工作,先设计xml的结构:

  

  1. <?xml version="1.0" encoding="gb2312"?>
  2. <Settings>
  3. <Setting ID="1">
  4. <title>****</title>
  5. <status>true</status>
  6. </Setting>
  7. </Settings>

  说明的是:ID是对应多个纪录的setting区分标记,title是设置页面的名字,也就是服务的名字,status表明当前的服务页面的状态,有两个值:true or false。在项目里添加名为Xml的文件夹,并保存设计的XML的命名为ServiceSettings.xml。

三、解决思路或过程

  首先,产生开关操作需要页面上的控件,这里使用的checkbox标签,当然这不是唯一选择,朋友们可以用其他的标签来作为输入控件的使用。思路是:我触击checkbox,对应的js代码记录值,并以ajax上传至后台action中,后台的action作出反应。

  js代码:

  1. function BloodController() {
  2. $.ajax({
  3. type: "POST",
  4. url: "/Admin/Controller",
  5. data: {},
  6. dataType: "Json"
  7. });
  8. }

  html代码:

  1. <input name="switch-field-1" class="ace ace-switch ace-switch-6" type="checkbox" onclick="Controller()" />

  ajax中的data,在这里不标出。触发后台action一次,那么就会运行action中操作xml的代码,那么就会改变xml中记录的值。

  然后,是action中操作xml的实现。思路是:首先要获取xml在应用程序中的相对位置,然后便是更改xml的值。

  1. public string Xmlpath = HttpRuntime.AppDomainAppPath.ToString() + "/Xml/ServiceSettings.xml";
  2.  
  3. public ActionResult Controller()
  4. {
  5. OperateXml sx = new OperateXml();
  6. sx.modifyXml(Xmlpath);
  7. return Json("");
  8. }

  说明的是:HttpRuntime.AppDomainAppPath.ToString();方法可以获取当前应用程序所在的根目录。为了操作多个xml文件,我写了OperateXml一个类方法,这里进入对xml的操作细节介绍。

  对于xml操作的原理不多说,其实ado.net支持的也很棒,xml文档的结构类似于html,但它的自由度更高,可标记性也更高。不多说,直接上代码,注释里都解释了:

  1. public void modifyXml(string Path)
  2. {
  3. XmlDocument xmlDoc = new XmlDocument();
  4. xmlDoc.Load(Path);
  5. XmlNodeList nodeList = xmlDoc.SelectSingleNode("Settings").ChildNodes;//获取bookstore节点的所有子节点
  6. foreach (XmlNode xn in nodeList)//遍历所有子节点
  7. {
  8. XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型
  9. ")
  10. {
  11. XmlNodeList nls = xe.ChildNodes;//继续获取xe子节点的所有子节点
  12. foreach (XmlNode xn1 in nls)//遍历
  13. {
  14. XmlElement xe2 = (XmlElement)xn1;//转换类型
  15. if (xe2.Name == "status")//如果找到
  16. {
  17. if (xe2.InnerText != "false")
  18. {
  19. xe2.InnerText = "false";//则修改
  20. break;//找到退出来就可以了
  21. }
  22. else if (xe2.InnerText == "false")
  23. {
  24. xe2.InnerText = "true";//则修改
  25. break;//找到退出来就可以了
  26. }
  27. }
  28. }
  29. break;
  30. }
  31. }
  32. xmlDoc.Save(Path);//保存。
  33. }

  因为代码注释里解释得够清晰了,这里不做赘述,需要说明一点是:这里的status只有两个值:true or false;在前台读出的便是这两个值,来进行页面控制的。

  接着,就是前台的读取xml里的值。思路是:在动态页面里读取xml值,然后做判断,true则显示页面,false则不显示页面。这里读xml代码贴出,注释里解释详细了。需要说明的是:这里为了控制多个页面的显示,用了List<string>来转载多个status的值。

  1. public List<string> getAllXml(string Path)
  2. {
  3. string status = "";
  4. XmlDocument doc = new XmlDocument();
  5. doc.Load(Path);
  6. XmlNode xn = doc.SelectSingleNode("Settings");
  7. XmlNodeList xnl = null;
  8. xnl = xn.SelectNodes("/Settings/Setting/status");
  9. List<string> list = new List<string>();
  10. foreach (XmlNode xn1 in xnl)
  11. {
  12. status = xn1.InnerText;
  13. list.Add(status);
  14. }
  15. return list;
  16. }

需要说明的是:这里为了控制多个页面的显示,用了List<string>来转载多个status的值。在前台页面里页面里就这样实现:

  1. @using TheOne.Tool
  2. @{
  3. OperateXml sx = new OperateXml();
  4. List<string> list = new List<string>();
  5. string path = HttpRuntime.AppDomainAppPath.ToString() + "/Xml/QuickServiceSettings.xml";
  6. list = sx.getAllXml(path);
  7. ].ToString();
  8. //string status_Bottle = list[1].ToString();
  9. //string status_Older = list[2].ToString();
  10. //string status_Blood = list[3].ToString();
  11. }
  12. @if (status_Umbrella == "true")
  13. {
  14. <div class="blog-grids wow fadeInDown" data-wow-duration=".8s" data-wow-delay=".2s">
  15. <div class="blog-grid-left">
  16. <a href="/UmbrellaManage/CreateUmbrellaUser"><img src="/Content/FrontEnd/images/yusan_2.jpg" class="img-responsive" alt=""></a>
  17. </div>
  18. <div class="blog-grid-right">
  19. <h5><a href="/UmbrellaManage/CreateUmbrellaUser">借用雨伞</a> </h5>
  20. </div>
  21. <div class="clearfix"> </div>
  22. </div>
  23.  
  24. }
  25. else if (status_Umbrella == "false")
  26. {
  27.  
  28. }

  到这里,使用xml控制页面开关介绍基本结束。

四、总结

  思路中最核心的便是对xml的操作,修改xml和读取xml。而对于如何实现checkbox状态切换,这个实现可以使用js来操作,读出status值,并让相应的js代码控制checkbox的状态是选中还是未选中。实际项目演示地址:点击 南农工红会

  如果我思路和方法有误,恳请各位指正,虚心求教。转载请注明来源与出处,谢谢合作 By 点将台无将

asp.net mvc后台操作之读写xml控制首页动态页面开关显示的更多相关文章

  1. ASP.NET MVC 后台接收集合参数和 jquery ajax 传值

    MVC 接收参数数组(集合)   示例样本:   public class Person {      public string FirstName { get; set; }      publi ...

  2. 序列化json对象,通过ajax传入asp.net mvc后台

    序列化json对象,通过ajax传入asp.net mvc后台 序列化json对象,通过ajax传入asp.net mvc后台   今天遇到一个问题,准备把组织好的json对象通过jquery.aja ...

  3. ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下

    ADO.NET   一.ADO.NET概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库 二.ADO.NET的组成 ①System.Data  → DataTable, ...

  4. 在ASP.NET MVC 3 中自定义AuthorizeAttribute时需要注意的页面缓存问题

    一.ASP.NET MVC中使用OutputCache实现服务器端页面级缓存 在ASP.NET MVC中,假如我们想要将某个页面(即某个Action)缓存在服务器端,可以在Action上标上以下特性: ...

  5. ASP.NET MVC 表格操作

    Beginners Guide for Creating GridView in ASP.NET MVC 5 http://www.codeproject.com/Articles/1114208/B ...

  6. 尝试asp.net mvc 基于controller action 方式权限控制方案可行性

    微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...

  7. 尝试asp.net mvc 基于controller action 方式权限控制方案可行性(转载)

    微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...

  8. ASP.NET MVC扩展自定义视图引擎支持多模板&动态换肤skins机制

    ASP.NET mvc的razor视图引擎是一个非常好的.NET MVC框架内置的视图引擎.一般情况我们使用.NET MVC框架为我们提供的这个Razor视图引擎就足够了.但是有时我们想在我们的项目支 ...

  9. ASP.NET MVC 扩展自定义视图引擎支持多模板&动态换肤skins机制

    ASP.NET  mvc的razor视图引擎是一个非常好的.NET  MVC 框架内置的视图引擎.一般情况我们使用.NET MVC框架为我们提供的这个Razor视图引擎就足够了.但是有时我们想在我们的 ...

随机推荐

  1. ASP.NET 4.0尚未在 Web 服务器上注册 解决方法

    使用VS2010创建web应用程序时出现如下提示ASP.NET 4.0尚未在 Web 服务器上注册.为了使网站正确运行,可能需要手动将 Web 服务器配置为使用 ASP.NET 4.0,按 F1 可了 ...

  2. 学习tensorflow之mac上安装tensorflow

    背景 听说谷歌的第二代机器学习的框架tensorflow开源了,我也心血来潮去探探大牛的产品.怎奈安装就折腾了一天,现在整理出来备忘. tensorflow官方网站给出的安装步骤很简单: # Only ...

  3. 基于redis分布式缓存实现(新浪微博案例)

    第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来 ...

  4. vim vundle 安装Base16 Vim主题

    1.vim /etc/vimrc set background=dark colorscheme base16-default 2.同样在vimrc中的vundle位置添加 Plugin 'chris ...

  5. lambda表达式-转载

    来源:http://www.cnblogs.com/knowledgesea/p/3163725.html   前言 1.天真热,程序员活着不易,星期天,也要顶着火辣辣的太阳,总结这些东西. 2.夸夸 ...

  6. sp_configure错误:不支持对系统目录进行即席更新。

    今天在一台数据库服务器上(Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64)     Standard Edition (64-bit))使 ...

  7. WinForm登陆:窗体间的数据传递

    1. 登陆逻辑 FrmMain 为主窗体(启动窗体) FrmLogin 为登陆窗体 在“主窗体”中使用ShowDialog()方法显示“登陆窗体”,并通过“登陆窗体”的DialogResult告知“主 ...

  8. 设计模式C#实现(十六)——中介者模式

    意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互. 适用 ...

  9. Java Keytools 证书转换成Openssl 的PEM 文件或keytools 导出私钥文件

    上一遍又说到Godaddy 生请证书流程与操作: 现因使用Incapsula 防护使用到https,在添加网站时需要自定义证书,其中需要上传私钥信息,因公钥是能过keytool 生成所以需要导出私钥信 ...

  10. 使用GDB调试程序

    GDB(GNU Debuger)是Linux中的一个功能强大的调试器.GDB可以让你查看程序的内部结构,打印变量值,设置断点,单步调试源码,运行时修改变量值,路径跟踪,线程切换,显示汇编代码等. 编译 ...