一、背景
在asp.net mvc项目里,用户需要开拓几个活动版面,并以侧栏的方式呈现在首页右侧,几个活动时间不一致,为避免浏览者在活动未开放之时进入未开放的服务页面。因此不仅需要在活动代码中加入限制功能,也需要在前台取消不合时宜的页面的展示。后台效果图:
二、问题分析
要想控制页面开关显示,就得有存储开关信息的介质,将在后台产生的操作记录下来,并在浏览者加载首页之时能读取操作记录并达到控制页面开关的目的。因此,考虑两种介质储存开关记录信息,一是用数据库mysql,二是用xml。考虑到这对数据库的功能大材小用,并且会增加首页加载时对数据库资源消耗,所以考虑使用xml文档来记录开关记录才是两者中较好的选择。这里需要我们做一下前期工作,先设计xml的结构:
<?xml version="1.0" encoding="gb2312"?> <Settings> <Setting ID="1"> <title>****</title> <status>true</status> </Setting> </Settings>
说明的是:ID是对应多个纪录的setting区分标记,title是设置页面的名字,也就是服务的名字,status表明当前的服务页面的状态,有两个值:true or false。在项目里添加名为Xml的文件夹,并保存设计的XML的命名为ServiceSettings.xml。
三、解决思路或过程
首先,产生开关操作需要页面上的控件,这里使用的checkbox标签,当然这不是唯一选择,朋友们可以用其他的标签来作为输入控件的使用。思路是:我触击checkbox,对应的js代码记录值,并以ajax上传至后台action中,后台的action作出反应。
js代码:
function BloodController() { $.ajax({ type: "POST", url: "/Admin/Controller", data: {}, dataType: "Json" }); }
html代码:
<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的值。
public string Xmlpath = HttpRuntime.AppDomainAppPath.ToString() + "/Xml/ServiceSettings.xml"; public ActionResult Controller() { OperateXml sx = new OperateXml(); sx.modifyXml(Xmlpath); return Json(""); }
说明的是:HttpRuntime.AppDomainAppPath.ToString();方法可以获取当前应用程序所在的根目录。为了操作多个xml文件,我写了OperateXml一个类方法,这里进入对xml的操作细节介绍。
对于xml操作的原理不多说,其实ado.net支持的也很棒,xml文档的结构类似于html,但它的*度更高,可标记性也更高。不多说,直接上代码,注释里都解释了:
public void modifyXml(string Path) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(Path); XmlNodeList nodeList = xmlDoc.SelectSingleNode("Settings").ChildNodes;//获取bookstore节点的所有子节点 foreach (XmlNode xn in nodeList)//遍历所有子节点 { XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型 ") { XmlNodeList nls = xe.ChildNodes;//继续获取xe子节点的所有子节点 foreach (XmlNode xn1 in nls)//遍历 { XmlElement xe2 = (XmlElement)xn1;//转换类型 if (xe2.Name == "status")//如果找到 { if (xe2.InnerText != "false") { xe2.InnerText = "false";//则修改 break;//找到退出来就可以了 } else if (xe2.InnerText == "false") { xe2.InnerText = "true";//则修改 break;//找到退出来就可以了 } } } break; } } xmlDoc.Save(Path);//保存。 }
因为代码注释里解释得够清晰了,这里不做赘述,需要说明一点是:这里的status只有两个值:true or false;在前台读出的便是这两个值,来进行页面控制的。
接着,就是前台的读取xml里的值。思路是:在动态页面里读取xml值,然后做判断,true则显示页面,false则不显示页面。这里读xml代码贴出,注释里解释详细了。需要说明的是:这里为了控制多个页面的显示,用了List<string>来转载多个status的值。
public List<string> getAllXml(string Path) { string status = ""; XmlDocument doc = new XmlDocument(); doc.Load(Path); XmlNode xn = doc.SelectSingleNode("Settings"); XmlNodeList xnl = null; xnl = xn.SelectNodes("/Settings/Setting/status"); List<string> list = new List<string>(); foreach (XmlNode xn1 in xnl) { status = xn1.InnerText; list.Add(status); } return list; }
需要说明的是:这里为了控制多个页面的显示,用了List<string>来转载多个status的值。在前台页面里页面里就这样实现:
@using TheOne.Tool @{ OperateXml sx = new OperateXml(); List<string> list = new List<string>(); string path = HttpRuntime.AppDomainAppPath.ToString() + "/Xml/QuickServiceSettings.xml"; list = sx.getAllXml(path); ].ToString(); //string status_Bottle = list[1].ToString(); //string status_Older = list[2].ToString(); //string status_Blood = list[3].ToString(); } @if (status_Umbrella == "true") { <div class="blog-grids wow fadeInDown" data-wow-duration=".8s" data-wow-delay=".2s"> <div class="blog-grid-left"> <a href="/UmbrellaManage/CreateUmbrellaUser"><img src="/Content/FrontEnd/images/yusan_2.jpg" class="img-responsive" alt=""></a> </div> <div class="blog-grid-right"> <h5><a href="/UmbrellaManage/CreateUmbrellaUser">借用雨伞</a> </h5> </div> <div class="clearfix"> </div> </div> } else if (status_Umbrella == "false") { }
到这里,使用xml控制页面开关介绍基本结束。
四、总结
思路中最核心的便是对xml的操作,修改xml和读取xml。而对于如何实现checkbox状态切换,这个实现可以使用js来操作,读出status值,并让相应的js代码控制checkbox的状态是选中还是未选中。实际项目演示地址:点击 南农工红会
如果我思路和方法有误,恳请各位指正,虚心求教。转载请注明来源与出处,谢谢合作 By 点将台无将
asp.net mvc后台操作之读写xml控制首页动态页面开关显示的更多相关文章
-
ASP.NET MVC 后台接收集合参数和 jquery ajax 传值
MVC 接收参数数组(集合) 示例样本: public class Person { public string FirstName { get; set; } publi ...
-
序列化json对象,通过ajax传入asp.net mvc后台
序列化json对象,通过ajax传入asp.net mvc后台 序列化json对象,通过ajax传入asp.net mvc后台 今天遇到一个问题,准备把组织好的json对象通过jquery.aja ...
-
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, ...
-
在ASP.NET MVC 3 中自定义AuthorizeAttribute时需要注意的页面缓存问题
一.ASP.NET MVC中使用OutputCache实现服务器端页面级缓存 在ASP.NET MVC中,假如我们想要将某个页面(即某个Action)缓存在服务器端,可以在Action上标上以下特性: ...
-
ASP.NET MVC 表格操作
Beginners Guide for Creating GridView in ASP.NET MVC 5 http://www.codeproject.com/Articles/1114208/B ...
-
尝试asp.net mvc 基于controller action 方式权限控制方案可行性
微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...
-
尝试asp.net mvc 基于controller action 方式权限控制方案可行性(转载)
微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...
-
ASP.NET MVC扩展自定义视图引擎支持多模板&;动态换肤skins机制
ASP.NET mvc的razor视图引擎是一个非常好的.NET MVC框架内置的视图引擎.一般情况我们使用.NET MVC框架为我们提供的这个Razor视图引擎就足够了.但是有时我们想在我们的项目支 ...
-
ASP.NET MVC 扩展自定义视图引擎支持多模板&;动态换肤skins机制
ASP.NET mvc的razor视图引擎是一个非常好的.NET MVC 框架内置的视图引擎.一般情况我们使用.NET MVC框架为我们提供的这个Razor视图引擎就足够了.但是有时我们想在我们的 ...
随机推荐
-
使用requestAnimationFrame做动画效果一
最近学习了requestAnimationFrame,看了张鑫旭直白易懂,但是某些地方语言过于裸露的文章http://www.zhangxinxu.com/wordpress/2013/09/css3 ...
-
【转载】VC维的来龙去脉
本文转载自 火光摇曳 原文链接:VC维的来龙去脉 目录: 说说历史 Hoeffding不等式 Connection to Learning 学习可行的两个核心条件 Effective Number o ...
-
MySQL优化GROUP BY-松散索引扫描与紧凑索引扫描
满足GROUP BY子句的最一般的方法是扫描整个表并创建一个新的临时表,表中每个组的所有行应为连续的,然后使用该临时表来找到组并应用累积函数(如果有).在某些情况中,MySQL能够做得更好,即通过索引 ...
-
[codevs]1060搞笑世界杯
CODEVS上一道钻石题,还是DP的思想,先来题目 1060 搞笑世界杯 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description ...
-
SpringBoot01 InteliJ IDEA安装、Maven配置、创建SpringBoot项目、属性配置、多环境配置
1 InteliJ IDEA 安装 下载地址:点击前往 注意:需要下载专业版本的,注册码在网上随便搜一个就行啦 2 MAVEN工具的安装 2.1 获取安装包 下载地址:点击前往 2.2 安装过程 到官 ...
-
用js来实现那些数据结构(数组篇01)
在开始正式的内容之前,不得不说说js中的数据类型和数据结构,以及一些比较容易让人混淆的概念.那么为什么要从数组说起?数组在js中是最常见的内存数据结构,数组数据结构在js中拥有很多的方法,很多初学者记 ...
-
tensorflow 1.0 学习:池化层(pooling)和全连接层(dense)
池化层定义在 tensorflow/python/layers/pooling.py. 有最大值池化和均值池化. 1.tf.layers.max_pooling2d max_pooling2d( in ...
-
使用go语言数据库
1.下载并导入数据库驱动包(注意配置环境变量.数据库.go.以及ENV) 这里选择了Go-MySQL-Driver这个实现.地址是:https://github.com/go-sql-driver/m ...
-
SPOJ 839 Optimal Marks(最小割的应用)
https://vjudge.net/problem/SPOJ-OPTM 题意: 给出一个无向图G,每个点 v 以一个有界非负整数 lv 作为标号,每条边e=(u,v)的权w定义为该边的两个端点的标号 ...
-
进度条的制作-python
import time,sys def view_bar(num, total): rate = float(num) / float(total) rate_num = int(rate * 100 ...