ASP.NET MVC获取多级类别组合下的产品
本篇是针对我在做项目过程中遇到的特定需求而做的一个Demo, 没有很大的通用性,读者酌情可绕行。
标题不能完全表达本意,确切的情景需要展开说。假设有三级分类,关于分类这样设计:
public class Category { public int Id { get; set; } public string Name { get; set; } public int ParentId { get; set; } }
然后产品可以属于多个分类,以下的Categories属性值是以英文逗号隔开、由分类编号拼接而成的字符串。
public class Product { public int Id { get; set; } public string Name { get; set; } public string Categories { get; set; } }
由于种种原因,Categories属性值只是存储了由第三级分类编号拼接而成的字符串。
在前端,需要把分类作为查询条件来查询产品,可能只选择一级分类,把一个数字字符串(比如"1")发送给服务端;可能同时选择一级和二级分类,也把一个数字字符串(比如"1,2")发送给服务端;当然,也有可能同时选择一级、二级和三级分类作为查询条件(比如"1,2,3")。换句话说,如果诸如"1"或"1,2"或"1,2,3"这样的查询条件转换成数组后,如果数组的每一个元素都被包含在Product的Categories属性值转换成的数组中,那这个产品就符合搜索条件。
简单来说,是这样:假设搜索条件是"1,2",Product的Categories属性值为"1,3,2,5",我们不是判断"1,2"这个字符串是否包含在"1,3,2,5"字符串中,而是把"1,2"先split成数组,叫做array1, 把"1,3,2,5"也split成数组,叫做array2,最后判断array1的每个元素是否都被包含在array2中。
还有一个问题需要解决:当前的Product的Categories属性值只存储了所有第三级分类编号拼接成的字符串,而前端输入的搜索条件可能会包含一级分类或二级分类等,所以,我们需要把Product转换一下,希望有一个类的某个属性值能存储由一级、二级、三级分类拼接而成的字符串。
public class ProductWithThreeCate { public int Id { get; set; } public string Name { get; set; } public string AllCategoreis { get; set; } }
以上, AllCategoreis属性值就用来存储由一级、二级、三级分类拼接而成的字符串。
有一个方法获取所有分类:
static List<Category> GetCategories() { return new List<Category>() { new Category(){Id = 1, Name = "根", ParentId = -1}, new Category(){Id = 2, Name = "一级分类1",ParentId = 1}, new Category(){Id = 3, Name = "一级分类2", ParentId = 1}, new Category(){Id = 4, Name = "二级分类11",ParentId = 2}, new Category(){Id = 5, Name = "二级分类12",ParentId = 2}, new Category(){Id = 6, Name = "二级分类21",ParentId = 3}, new Category(){Id = 7, Name = "二级分类22",ParentId = 3}, new Category(){Id = 8, Name = "三级分类111",ParentId = 4}, new Category(){Id = 9, Name = "三级分类112",ParentId = 4}, new Category(){Id = 10, Name = "三级分类121",ParentId = 5}, new Category(){Id = 11, Name = "三级分类122",ParentId = 5}, new Category(){Id = 12, Name = "三级分类211",ParentId = 6}, new Category(){Id = 13, Name = "三级分类212",ParentId = 6}, new Category(){Id = 14, Name = "三级分类221",ParentId = 7} }; }
有一个方法获取所有产品:
static List<Product> GetProducts() { return new List<Product>() { new Product(){Id = 1, Name = "产品1",Categories = "10,12"}, new Product(){Id = 2, Name = "产品2", Categories = "12,13"}, new Product(){Id = 3, Name = "产品3",Categories = "10,11,12"}, new Product(){Id = 4, Name = "产品4",Categories = "13,14"}, new Product(){Id = 5, Name = "产品5",Categories = "11,13,14"} }; }
接下来的方法是根据搜索条件(比如是"1,2")来查找满足条件的ProductWithThreeCate集合,如下:
/// <summary> /// 获取满足某些条件的集合 /// </summary> /// <param name="query">以英文逗号隔开的字符串,比如:2,5</param> /// <returns></returns> static List<ProductWithThreeCate> GetResultByQuery(string query) { //最终结果 List<ProductWithThreeCate> result = new List<ProductWithThreeCate>(); //临时结果 此时ProductWithThreeCat的属性AllCategoreis包含所有一级、二级、三级分类ID拼接成的字符串 List<ProductWithThreeCate> tempResult = new List<ProductWithThreeCate>(); //获取所有的产品 List<Product> allProducts = GetProducts(); //遍历这些产品 foreach (var item in allProducts) { ProductWithThreeCate productWithThreeCate = new ProductWithThreeCate(); productWithThreeCate.Id = item.Id; productWithThreeCate.Name = item.Name; //所有一级、二级、三级拼接成以英文逗号隔开的字符串 string temp = string.Empty; //当前产品只包含三级拼接成的、也是以英文隔开的字符串,split成数组 string[] theThirdCates = item.Categories.Split(','); //遍历这些三级数组 foreach (string i in theThirdCates) { //三级类别转换成整型 int theThirdInt = int.Parse(i); //获取三级类别 Category theThirdCate = GetCategories().Where(c => c.Id == theThirdInt).FirstOrDefault(); //获取二级类别 Category theSecondCate = GetCategories().Where(c => c.Id == theThirdCate.ParentId).FirstOrDefault(); //获取一级类别 Category theFirstCate = GetCategories().Where(c => c.Id == theSecondCate.ParentId).FirstOrDefault(); temp += i + "," + theSecondCate.Id.ToString() + "," + theFirstCate.Id.ToString() + ","; } //去掉最后一个英文逗号 temp = temp.Substring(0, temp.Length - 1); //转换成集合,去除重复项,比如不同的三级可能有相同的一级或二级父类 IEnumerable<string> tempArray = temp.Split(',').AsEnumerable().Distinct(); //所有一级、二级、三级拼接成以英文逗号隔开的字符串,但已经去除了重复的一级和二级 string tempagain = string.Empty; //再次遍历集合拼接成字符串 foreach (var s in tempArray) { tempagain += s + ","; } productWithThreeCate.AllCategoreis = tempagain.Substring(0, tempagain.Length - 1); tempResult.Add(productWithThreeCate); } //遍历临时结果 foreach (var item in tempResult) { //把当前包含一级、二级、三级的,以英文逗号隔开的字符串split成数组 string[] itemArray = item.AllCategoreis.Split(','); //把当前查询字符串split成数组 string[] queryArray = query.Split(','); //如果queryArray的每一个元素都被包含在itemArray中,那就保存起来 if (queryArray.All(x => itemArray.Contains(x)) == true) { result.Add(item); } } return result; }
客户端的调用如下:
List<ProductWithThreeCate> result = GetResultByQuery("2,5"); //遍历最终的结果 foreach (var item in result) { Console.WriteLine(item.Name+ " " + item.AllCategoreis); } Console.ReadKey();
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对猪先飞的支持。如果你想了解更多相关内容请查看下面相关链接
原文出处:https://www.cnblogs.com/darrenji/p/4267926.html
相关文章
- 这篇文章主要为大家详细介绍了ASP.NET购物车的实现过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
- 在开发过程中,使用Visual Studio的断点调试功能可以很方便帮我们调试发现程序存在的错误,同样Visual Studio也支持对SQL Server里面的存储过程进行调试,下面就让我们看看具体的调试方法。...2021-09-22
ASP.NET Core根据环境变量支持多个 appsettings.json配置文件
这篇文章主要介绍了ASP.NET Core根据环境变量支持多个 appsettings.json配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22- 这篇文章主要介绍了记一次EFCore类型转换错误及解决方案,帮助大家更好的理解和学习使用asp.net core,感兴趣的朋友可以了解下...2021-09-22
- 这篇文章主要介绍了SpringMVC文件上传原理及实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-15
C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?
这篇文章主要介绍了C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?,这也小编做.NET项目时经常思考和让人混乱的一个问题,这篇文章写的挺好,一下清晰了许多,需要的朋友可以参考下...2020-06-25详解ASP.NET Core 中基于工厂的中间件激活的实现方法
这篇文章主要介绍了ASP.NET Core 中基于工厂的中间件激活的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-22使用Maven 搭建 Spring MVC 本地部署Tomcat的详细教程
这篇文章主要介绍了使用Maven 搭建 Spring MVC 本地部署Tomcat,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-08-16asp.net通过消息队列处理高并发请求(以抢小米手机为例)
这篇文章主要介绍了asp.net通过消息队列处理高并发请求(以抢小米手机为例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22ASP.NET单选按钮控件RadioButton常用属性和方法介绍
RadioButton又称单选按钮,其在工具箱中的图标为 ,单选按钮通常成组出现,用于提供两个或多个互斥选项,即在一组单选钮中只能选择一个...2021-09-22- 这篇文章主要介绍了SpringMvc自动装箱及GET请求参数原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-19
- 这篇文章主要介绍了SpringMvc获取请求头请求体消息过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-17
ASP.NET 2.0中的数据操作:使用两个DropDownList过滤的主/从报表
在前面的指南中我们研究了如何显示一个简单的主/从报表, 该报表使用DropDownList和GridView控件, DropDownList填充类别,GridView显示选定类别的产品. 这类报表用于显示具有...2016-05-19Springmvc ResponseBody响应json数据实现过程
这篇文章主要介绍了Springmvc ResponseBody响应json数据实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-26ASP.NET中iframe框架点击左边页面链接 右边显示链接页面内容
这篇文章主要介绍了ASP.NET中iframe框架点击左边页面链接,右边显示链接页面内容的实现代码,感兴趣的小伙伴们可以参考一下...2021-09-22- 本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下...2020-06-25
- ASP.NET Web API具有与ASP.NET MVC类似的编程方式,ASP.NET Web API不仅仅具有一个完全独立的消息处理管道,而且这个管道比为ASP.NET MVC设计的管道更为复杂,功能也更为强大。下面创建一个简单的Web API项目,需要的朋友可以参考下...2021-09-22
- 这篇文章主要为大家介绍了javascript中的MVC模式,MVC是一种软件架构模式,一般把软件模式分为三部分,本文就针对MVC模式的三部分进行讲解,感兴趣的小伙伴们可以参考一下...2016-02-01
- Spring MVC是Spring系列框架中使用频率最高的部分。不管是Spring Boot还是传统的Spring项目,只要是Web项目都会使用到Spring MVC部分。因此程序员一定要熟练掌握MVC部分。本篇博客简要分析Spring MVC处理一个请求的流程。...2021-02-06
- 这篇文章主要介绍了ASP.NET连接MySql数据库的2个方法及示例,使用的是MySQL官方组件和ODBC.NET,需要的朋友可以参考下...2021-09-22