.net mvc前台如何接收和解析后台的字典类型的数据 二分搜索算法 window.onunload中使用HTTP请求 网页关闭 OpenCvSharp尝试 简单爬虫
.net mvc前台如何接收和解析后台的字典类型的数据
很久没有写博客了,最近做了一个公司门户网站的小项目,其中接触到了一些我不会的知识点,今日事情少,便记录一下,当时想在网上搜索相关的内容,但是没有找到。
今天想记录一下这样一个小的需求的做法。先说一下我的想法:因为是一个门户网站,所以我需要从后台传大量的数据到前台,我考虑的是这样做,用一个字典类型(dictionary<,>)的变量,把数据的类型(比如新闻,公司产品,技术特点,公司简介)等等作为字典的键值,而把相关的数据放到一个List<T>集合里,然后把集合的内容作为键值对应的value,想这样传递到前台来。这样的一个字典数据就比较的复杂了,我后台都做好了,前端也能接收到数据,但不知道怎么把这些数据一一拿出来,在网上查了很多资料,但问题没有解决,后来知道公司的一个前辈曾把一个字典数据通过web api传递给app端,借鉴了一下他的方法,最终达到了我的目的。
事先声明,本篇博客我只会把关键代码贴上,而不会写一个完整的demo,因为那样会增加很多不必要的内容。
首先把后台的代码贴出来看看:

[HttpPost] public ActionResult GetData() { try { //声明一个字典变量 Dictionary<string,List<object>> dictionary = new Dictionary<string,List<object>>(); //获取轮播图图片类型id var ImageType = context.DicItems.FirstOrDefault(x => x.Name == "主页轮播图").Id; var BanImage = context.ManageImages.Where(m => m.ParentId == ImageType && m.IsDelete == false).OrderByDescending(m => m.UploadTime).ToList(); var BanImageData = BanImage.Select(x => new { x.Id, x.ImageTitle, x.ImageUrl }).ToList().Cast<object>().ToList(); //将轮播图信息添加到字典中 dictionary.Add("BanImage", BanImageData); //技术特色 var technology = context.Technologies.Where(x => x.IsDelete == false).OrderByDescending(x => x.CreateTime); var TechnologyData = technology.Select(x => new { x.Id, x.TechName, x.CoverImage }).ToList().Cast<object>().ToList(); dictionary.Add("Technology", TechnologyData); return Json(new { Data = dictionary, Result = true }); } catch (Exception exception) { return Json(new { Result = false, exception.Message }); } }

本段代码,我首先声明了一个字段类型的变量:
1
|
Dictionary< string ,List< object >> dictionary = new Dictionary< string ,List< object >>(); |
然后用ef操作数据库获取了一些数据,并将数据存到List<T>集合中:

var technology = context.Technologies.Where(x => x.IsDelete == false).OrderByDescending(x => x.CreateTime);//context是声明的上下文,代码中未贴出 var TechnologyData = technology.Select(x => new { x.Id, x.TechName, x.CoverImage }).ToList().Cast<object>().ToList();

第三步,把数据添加到字典中:
dictionary.Add("Technology", TechnologyData);
前面是键(key),后面是值(value),有关字典类型不清楚的可百度,此处不做说明。
以json格式像前台回传数据:
return Json(new { Data = dictionary, Result = true });
传过去的数据应该为如下一种格式:

{ "key1":[ {"Id":"xxxxxx","name":"xxxxxx",.....}, {"Id":"xxxxxx","name":"xxxxxx",.....}, {"Id":"xxxxxx","name":"xxxxxx",.....}, {"Id":"xxxxxx","name":"xxxxxx",.....} ], "key2":[ {"Id":"xxxxxx","name":"xxxxxx",.....}, {"Id":"xxxxxx","name":"xxxxxx",.....}, {"Id":"xxxxxx","name":"xxxxxx",.....}, {"Id":"xxxxxx","name":"xxxxxx",.....} ], ..... }

每个key下面的值可用下标获取,像这样:key1[2].name,key2[1].Id.
哈哈,这其实就是json格式,我太外行了,所以折腾很久也不知道怎么弄。
好了,现在说一下前台接收数据:
先贴出代码看看:<script type="text/javascript">

$(document).ready(function(){ query(); });
var allData = {};
var query = function () { $.ajax({ type: 'post', url: "@Url.Action("GetData","Home")", dataType: 'json', success: function (data) { // alert(data.Message); if (data.Result) { allData = getData(data.Data); var BanImageData = allData["BanImage"]; for (var i = 0; i <= 3; i++) { var ImageId = "BanImage_" + i; alert(BanImageData[i].ImageUrl); $("#" + ImageId).attr("src", BanImageData[i].ImageUrl); } } } }); } var getData = function (data) { var source = {}; for (var item in data) { //item即为键值 //source[item]为一个键值对应的list集合的值 source[item] = data[item]; } return source; }

在ajax里面,首先向后台发送数据请求,然后程序才运行到之前的后台代码,当后台把这个数据回传到前台来的时候,由
这个data接收,这个data就包含两个值,一个交Result ,另一个交Data,但是这个data.Data数据真的有点复杂,不是像data.Result那样是个单数据,就是这里卡主我了。
后来是这样来做的:主要看下面这段代码:

var getData = function (data) { var source = {}; for (var item in data) { //item即为键值 //source[item]为一个键值对应的list集合的值 source[item] = data[item]; } return source; }

这个函数在上面运行起来就是这样的:getData(data.Data);
{}是js中的对象类型,,
for(var item in data) 就把字典里的每一组数据遍历一遍,然后把对应的键值和数据保存到source{}对象中。然后就是常规操作读取数据了。

allData = getData(data.Data); var BanImageData = allData["BanImage"]; for (var i = 0; i <= 3; i++) { var ImageId = "BanImage_" + i; alert(BanImageData[i].ImageUrl); $("#" + ImageId).attr("src", BanImageData[i].ImageUrl); }

allData拿到数据后,每个键值对应的数据就可以这样通过键值获取了,获取后,具体是哪一组数据,再用下标获取就可以了。
,绕来绕去还是蛮麻烦的哈,但主要是数据比较复杂。
二分搜索算法
二分搜索用于在已经排序好的集合中搜索值,每次与中间值对比,小于则搜索前半段,大于中间值则在后半段,继续二分搜索,实现代码:

/// <summary> /// 二分查找 /// </summary> /// <param name="arr">已经排序过的数组</param> /// <param name="searchkey">搜索值</param> /// <returns></returns> private static int BinarySearch(int[] arr, int searchkey) { int start = 0; int end = arr.Length - 1; int mid = 0; while (start <= end) { mid = (start + end) / 2; if (arr[mid] < searchkey) //中间值小于 搜索值,说明要查找值在尾部 { start = mid + 1; } else if (arr[mid] > searchkey)//中间值大于搜索值,说明要搜索值在首部 { end = mid - 1; } else { return mid; } } return -mid; }

如果查询不到值返回的是负的最后查询的中间值的位置,负值变正后+1 则可用来有序插入搜索值,使列表保持排序。
window.onunload中使用HTTP请求
在页面关闭时触发window.onunload
在onunload中要使用http请求,需要使用同步请求:
如:
$.ajax({ url: url, async: false });
iframe页面关闭后执行方法:
因为iframe之上还存在父页面,在iframe页面里面实现了window.onunload事件,之后 直接关闭父页面,不能触发iframe页面的onunload事件,改进后的代码:
父页面关闭也可以执行子页面关闭后的方法:
var exit=function (){}; window.onunload = exit; if (top.location != self.location) { //当前页面不是顶级页面时 parent.window.onunload = exit; }
网页关闭
有时候window.close();无效,
改成
window.open("about:blank", "_self").close();
用于关闭页面
OpenCvSharp尝试
OpenCvSharp是封装了OpenCV的.net版本
项目地址:https://github.com/shimat/opencvsharp
简单使用:
1、NuGet安装
2、使用OpenCvSharp打开一张图片,需要添加 OpenCvSharp 命名空间

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using OpenCvSharp; namespace OpenCvDemo { class Program { static void Main(string[] args) { Mat source = new Mat(@"F:\Test\OpenCvDemo\OpenCvDemo\p.jpg", ImreadModes.Color); Cv2.ImShow("Demo", source); Cv2.WaitKey(0); } } }

运行结果:
简单爬虫
使用HtmlAgilityPack来开发简单爬虫:
1、NuGet安装HtmlAgilityPack
2、简单的爬虫代码

HtmlWeb web=new HtmlWeb(); string url="网站地址"; var doc = web.Load(url); //使用并行查询来获取元素的属性值 IList<string> detailPageUrls = new List<string>(); doc.DocumentNode.SelectNodes("//a[@class='js-title value title-font']") .AsParallel().ToList().ForEach(hn => { string detailPageurl = hn.GetAttributeValue("href", string.Empty); if (!string.IsNullOrWhiteSpace(detailPageurl)) { detailPageUrls.Add(detailPageurl); } });

.net mvc前台如何接收和解析后台的字典类型的数据 二分搜索算法 window.onunload中使用HTTP请求 网页关闭 OpenCvSharp尝试 简单爬虫的更多相关文章
- .net mvc前台如何接收和解析后台的字典类型的数据
很久没有写博客了,最近做了一个公司门户网站的小项目,其中接触到了一些我不会的知识点,今日事情少,便记录一下,当时想在网上搜索相关的内容,但是没有找到. 今天想记录一下这样一个小的需求的做法.先说一下我 ...
- .net Mvc Controller 接收 Json/post方式 数组 字典 类型 复杂对象
原文地址:http://www.cnblogs.com/fannyatg/archive/2012/04/16/2451611.html ------------------------------- ...
- HttpServletResponse工具类和HttpServletRequest工具类,前台参数接收方式和后台返回(JSON)数据格式
RequestUtils.java 操作类 package cn.utils; import org.apache.commons.lang3.StringUtils; import org.slf4 ...
- JS前端取得并解析后台服务器返回的JSON数据的方法
摘要:主要介绍:使用eval函数解析JSON数据:$.getJSON()方法获得服务器返回的JSON数据 JavaScript eval() 函数 eval(string) 函数可计算某个字符串,并执 ...
- 前台js接收后台的json数据
后台返回的json数据,如php的: return json_encode($data); 在前台 js接收如下: function json2object(str){ var jsstr = str ...
- 前台JSON字符串,spring mvc controller也接收字符串
前台JSON字符串,spring mvc controller也接收字符串 前台: $.post(url, { data : JSON.stringify(obj) }, function(data) ...
- 将前台json对象传入java后台
前台json格式的数据如何传入后台 1. 将要传入后台的数据组装成JSON格式的字符串: var jsonStr = [{'name':'jim' , 'age':20} , {'name':'kin ...
- JS前台base32加密,C#后台解码
公司的系统应用后,客户那边用appscan工具检测到严重的漏洞 1.使用 SQL 注入的认证旁路 (1/2)--未对用户输入正确执行危险字符清理 2.已解密的登录请求 (2/2)----诸如用户名.密 ...
- springMVC中对HTTP请求form data和request payload两种数据发送块的后台接收方式
最近在做项目中发现,前台提交数据时,如果通过form表单提交和ajax发送json时,springMVC后台接收不能都通过@ModelAttribute方式处理,经过一番查找后,ajax发送json请 ...
随机推荐
- Java文件操作大全
//1.创建文件夹 //import java.io.*; File myFolderPath = new File(str1); try { if (!myFolderPath.exists()) ...
- Trapping Rain Water leetcode java
题目: Given n non-negative integers representing an elevation map where the width of each bar is 1, co ...
- Gson 使用总结 高级用法
Gson基本用法 参考:http://www.jianshu.com/p/e740196225a4 Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,前者实现反序列 ...
- vue-router 懒加载优化
一.路由懒加载 1.先安装 babel 动态引入插件 npm install --save-dev babel-plugin-syntax-dynamic-import 2.修改router/inde ...
- php CURL 请求头和响应头获取
1.从CURL中获取响应头 $oCurl = curl_init(); // 设置请求头, 有时候需要,有时候不用,看请求网址是否有对应的要求 $header[] = "Content-ty ...
- Cognos配置oracle类型内容库时报错
Cognos初次安装,创建内容库为Oracle数据库类型的时候,报下面的错误 [Content Manager database connection][ ERROR ] The database c ...
- Android ProgressBar具体解释以及自己定义
版本号:1.0 日期:2014.5.16 版权:© 2014 kince 转载注明出处 这一次主要说一下Android下的进度条.为什么是它呢,由于最近被其各种美轮美奂的设计所倾倒,计划逐渐 ...
- Nuget出现错误怎么办?
Go to the packages folder in the Windows Explorer and delete it. Open Visual Studio and Go to To ...
- [AngularJS] Angular 1.3 ngMessages with ngAnimate
Note: Can use $dirty to check whether user has intracted with the form: https://docs.angularjs.org/a ...
- 将Tp-link无线路由器桥接到Dlink无线路由器上
笔者家中原有两台笔记本和两台IPad,通过一台Dlink无线路由器(型号DIR-612,以下简称Dlink)上网,Dlink以PPPOE方式连到小区宽带.一直还可以. 后来为了练习Linux,启用了一 ...