ASP.NET MVC之JsonResult(六)

简介:

前言

这一节我们利用上节所讲Unobtrusive Ajax并利用MVC中的JsonResult来返回Json数据。

JsonResult

上节我们利用分部视图返回数据并进行填充,当我们发出请求需要获取数据时都是返回json,所以我们在上一节的基础上进一步学习。

既然是返回Json数据,我们接下来要在控制器上进行定义如下代码:

(1)通过选择的类别名称来筛选数据

复制代码
        private IEnumerable<Blog> GetBlog(string selectedCategory)
        {
            var data = blogs.AsEnumerable();
            if (selectedCategory != "All")
            {
                Category selected = (Category)Enum.Parse(typeof(Category), selectedCategory);
                data = blogs.Where(p => p.Category == selected);
            }
            return data;
        }
复制代码

(2)利用JsonResult返回Json数据

        public JsonResult GetBlogDataJson(string selectedCategory = "All")
        {
            var data = GetBlog(selectedCategory);
            return Json(data, JsonRequestBehavior.AllowGet);
        }

(3)接下来我们在视图中利用JS对获取的数据进行拼接

复制代码
<script type="text/javascript">
    function blogData(data) {
        var blog = $("#blogsTable");
        blog.empty();
        for (var i = 0; i < data.length; i++) {
            var b = data[i];
            blog.append("<tr><td>" + b.ID + "</td><td>"
            + b.Name + "</td><td>" + b.Name + "</td><td>"
            + b.BlogAddress + "</td>" + b.BlogAddress + "<td></td>"
            + b.Description + "</td>" + b.Description + "<td></td>"
            + b.Category + "</td><td>" + b.Category + "</td></tr>");
        }
    }
</script>
复制代码

(4)我们通过链接@Url.Action来筛选数据,如下:

复制代码
    @foreach (string category in Enum.GetNames(typeof(Category)))
    {
        <div class="ajaxLink">
            @Ajax.ActionLink(category, "GetBlogs",
                new { selectedCategory = category },
                new AjaxOptions
                {
                    Url = Url.Action("GetBlogDataJson", new { selectedCategory = category }),
                    OnSuccess = "blogData" //返回数据后调用上述blogData进行填充数据
                })
        </div>
    }
复制代码

接下来我们来看看效果:

我们点击任意一个类别来看看:

到此为止,我们可以下结论利用JsonResult能够正确返回数据。

但是但是,貌似出了一个问题,你发现了没:类别怎么用数字表示的呢?

分析:我们在通过返回的数据在前台来看看是否是前台返回数据时作了什么手脚。

到了这里打消了我们上面的推论,看来是后台出问题了,我们想应该在序列化时无法序列化枚举值,于是我们可以做一个测试:

内置JavaScriptSerializer序列化枚举

我们实例化Blog实例:

            var blog = new Blog { Id = 4, Name = "xpy0928 4", Category = Category.SQLServer, BlogAddress = "http://www.cnblogs.com/CreateMyself/", Description = "靠自己!" };
            var jsonSerial = new JavaScriptSerializer();
            var blogJson = jsonSerial.Serialize(blog);
            var data = GetBlog(selectedCategory);

序列化如下:

果然如我们所料,内置序列化无法序列化枚举,此时我们看看枚举中是否有通过其数字得到其名称的方法,查看了一下,需要如下操作:

Enum.GetName(typeof(Category), b.Category)

既然枚举需要进行转换,接着我们通过投影来进行转换,如下:

复制代码
            var data = GetBlog(selectedCategory).Select(b => new
            {
                ID = b.Id,
                Name = b.Name,
                BlogAddress = b.BlogAddress,
                Description = b.Description,
                Category = Enum.GetName(typeof(Category), b.Category)
            });
            return Json(data, JsonRequestBehavior.AllowGet);
复制代码

我们再来看看效果:

 

至此我们对枚举无法进行序列化就这样结束。到这里我想了想,既然序列化类无法进行序列化,那要是Json.Net又会怎样呢?

JSON.NET序列化枚举

            var blog = new Blog { Id = 4, Name = "xpy0928 4", Category = Category.SQLServer, BlogAddress = "http://www.cnblogs.com/CreateMyself/", Description = "靠自己!" };
            var blogJson = JsonConvert.SerializeObject(blog);

我们看看序列化结果:

Json.NET也无法进行序列化枚举,通过查询相关资料,我们在序列化枚举时在枚举类上添加如下特性即可:

[JsonConverter(typeof(StringEnumConverter))]

结语 

之前没怎么接触过序列化过枚举,在学习ASP.NET MVC这一系列时,发现有些东西非常简单,但是在做的过程中,还是或多或少有点小问题,可能别人早已经知道了,但是通过学习今天才明白过来,为时未晚,掌握了就可以了。特此记下:

内置序列化器,序列化枚举通过如下转换

Enum.GetName(typeof(Category), b.Category)

利用JSON.NET序列化枚举

[JsonConverter(typeof(StringEnumConverter))]







 
目录
相关文章
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
42 0
|
1月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
29 0
|
1月前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
5 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
100 5
|
3月前
|
XML 前端开发 定位技术
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
25 0
|
3月前
|
前端开发
.net core mvc获取IP地址和IP所在地(其实是百度的)
.net core mvc获取IP地址和IP所在地(其实是百度的)
124 0
|
5月前
|
开发框架 自然语言处理 前端开发
基于ASP.NET MVC开发的、开源的个人博客系统
基于ASP.NET MVC开发的、开源的个人博客系统
52 0
|
8月前
|
SQL 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(完:内附源码)
经过一段时间的准备,【ASP.NET Core MVC开发实战之商城系统】已经完成,目前代码已开发完成,先将全部内容整理分享,如有不足之处,还请指正。
107 0
|
前端开发 .NET 数据格式
Asp.net MVC JsonResult 忽略属性
指定 JavaScriptSerializer 不序列化公共属性或公共字段。无法继承此类。 命名空间:  System.Web.Script.Serialization程序集:  System.
981 0
|
8月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
117 0