.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);
                    }
                });

官网地址:https://html-agility-pack.net/

.net mvc前台如何接收和解析后台的字典类型的数据 二分搜索算法 window.onunload中使用HTTP请求 网页关闭 OpenCvSharp尝试 简单爬虫的更多相关文章

  1. .net mvc前台如何接收和解析后台的字典类型的数据

    很久没有写博客了,最近做了一个公司门户网站的小项目,其中接触到了一些我不会的知识点,今日事情少,便记录一下,当时想在网上搜索相关的内容,但是没有找到. 今天想记录一下这样一个小的需求的做法.先说一下我 ...

  2. .net Mvc Controller 接收 Json/post方式 数组 字典 类型 复杂对象

    原文地址:http://www.cnblogs.com/fannyatg/archive/2012/04/16/2451611.html ------------------------------- ...

  3. HttpServletResponse工具类和HttpServletRequest工具类,前台参数接收方式和后台返回(JSON)数据格式

    RequestUtils.java 操作类 package cn.utils; import org.apache.commons.lang3.StringUtils; import org.slf4 ...

  4. JS前端取得并解析后台服务器返回的JSON数据的方法

    摘要:主要介绍:使用eval函数解析JSON数据:$.getJSON()方法获得服务器返回的JSON数据 JavaScript eval() 函数 eval(string) 函数可计算某个字符串,并执 ...

  5. 前台js接收后台的json数据

    后台返回的json数据,如php的: return json_encode($data); 在前台 js接收如下: function json2object(str){ var jsstr = str ...

  6. 前台JSON字符串,spring mvc controller也接收字符串

    前台JSON字符串,spring mvc controller也接收字符串 前台: $.post(url, { data : JSON.stringify(obj) }, function(data) ...

  7. 将前台json对象传入java后台

    前台json格式的数据如何传入后台 1. 将要传入后台的数据组装成JSON格式的字符串: var jsonStr = [{'name':'jim' , 'age':20} , {'name':'kin ...

  8. JS前台base32加密,C#后台解码

    公司的系统应用后,客户那边用appscan工具检测到严重的漏洞 1.使用 SQL 注入的认证旁路 (1/2)--未对用户输入正确执行危险字符清理 2.已解密的登录请求 (2/2)----诸如用户名.密 ...

  9. springMVC中对HTTP请求form data和request payload两种数据发送块的后台接收方式

    最近在做项目中发现,前台提交数据时,如果通过form表单提交和ajax发送json时,springMVC后台接收不能都通过@ModelAttribute方式处理,经过一番查找后,ajax发送json请 ...

随机推荐

  1. [17] 楼梯(Stairs)图形的生成算法

    感觉这图形怎么看怎么像搓衣板. 顶点数据的生成 bool YfBuildStairsVertices ( Yreal width, Yreal length, Yreal height, Yuint ...

  2. 【Handler】Looper 原理 详解 示例 总结

    核心知识点 1.相关名词 UI线程:就是我们的主线程,系统在创建UI线程的时候会初始化一个Looper对象,同时也会创建一个与其关联的MessageQueue Handler:作用就是发送与处理信息, ...

  3. 国庆大礼包:2014年最全的ANDROID GUI模板和线框图免费下载

    距离上次分享GUI模板有很长时间了,这段时间里设计趋势不断变化,谷歌推出了最新的Android L以及全新的界面设计,UI设计师又有得忙了,今天收集了一组实用的GUI模板和线框图,包含最新的Andro ...

  4. php过滤文字中的表情字符和mysql服务端对emoji的支持

    1.过滤emoji表情的原因 在我们的项目开发中,emoji表情是个麻烦的东西,即使我们可以能存储,也不一定能完美显示,因为它的更新速度很快:在iOS以外的平台上,例如PC或者android.如果你需 ...

  5. IOS网络访问详解

    第一.访问网络的方式 同步请求:数据的请求过程是由主线程发起的,网络加载需要一定的时间,因此会堵塞主线程 异步请求:数据的请求在多线程中完成 同步请求无法取消,异步请求的过程中可以取消,同步请求无法监 ...

  6. PCL学习笔记二:Registration (ICP算法)

    原文:http://blog.csdn.net/u010696366/article/details/8941938 PCL Registration API Registration:不断调整,把不 ...

  7. 【C#】C#委托学习

    虽然做.NET这行也快2年了,但基础不太好啊,今天看了下委托方面的知识,记录下. 1.委托 总的来说,委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋 ...

  8. C#.NET常见问题(FAQ)-找不到类型或命名空间名称“ManagementBaseObject”怎么办

    如下图所示,虽然添加了using System.Management,还是报错   System.Management似乎跟普通的命名空间不太一样,这个项目还需要添加.右击这个项目的csproj文件, ...

  9. ArcGIS Pro体验04——菜单栏

    对菜单栏进行熟悉一下: 1.地图菜单 剪切板(Clipboard):剪切(Cut).复制(Copy).粘贴(Paste),这些不用说了,在ArcMap中是放在"编辑"菜单下面的.当 ...

  10. Excel只能输入不许修改

        昨天出差,用户有个需求:需要他人录入数据,为了防止已经录入的数据被修改(录入数据由多方完成),必须限定只能输入,不能修改(修改时需要密码),最开始的方案是各设置一个密码,但如果他们相互之间联合 ...