ASP.NET MVC獲取多級(jí)類別組合下的產(chǎn)品
本篇是針對(duì)我在做項(xiàng)目過程中遇到的特定需求而做的一個(gè)Demo, 沒有很大的通用性,讀者酌情可繞行。
標(biāo)題不能完全表達(dá)本意,確切的情景需要展開說。假設(shè)有三級(jí)分類,關(guān)于分類這樣設(shè)計(jì):
public class Category { public int Id { get; set; } public string Name { get; set; } public int ParentId { get; set; } }
然后產(chǎn)品可以屬于多個(gè)分類,以下的Categories屬性值是以英文逗號(hào)隔開、由分類編號(hào)拼接而成的字符串。
public class Product { public int Id { get; set; } public string Name { get; set; } public string Categories { get; set; } }
由于種種原因,Categories屬性值只是存儲(chǔ)了由第三級(jí)分類編號(hào)拼接而成的字符串。
在前端,需要把分類作為查詢條件來(lái)查詢產(chǎn)品,可能只選擇一級(jí)分類,把一個(gè)數(shù)字字符串(比如"1")發(fā)送給服務(wù)端;可能同時(shí)選擇一級(jí)和二級(jí)分類,也把一個(gè)數(shù)字字符串(比如"1,2")發(fā)送給服務(wù)端;當(dāng)然,也有可能同時(shí)選擇一級(jí)、二級(jí)和三級(jí)分類作為查詢條件(比如"1,2,3")。換句話說,如果諸如"1"或"1,2"或"1,2,3"這樣的查詢條件轉(zhuǎn)換成數(shù)組后,如果數(shù)組的每一個(gè)元素都被包含在Product的Categories屬性值轉(zhuǎn)換成的數(shù)組中,那這個(gè)產(chǎn)品就符合搜索條件。
簡(jiǎn)單來(lái)說,是這樣:假設(shè)搜索條件是"1,2",Product的Categories屬性值為"1,3,2,5",我們不是判斷"1,2"這個(gè)字符串是否包含在"1,3,2,5"字符串中,而是把"1,2"先split成數(shù)組,叫做array1, 把"1,3,2,5"也split成數(shù)組,叫做array2,最后判斷array1的每個(gè)元素是否都被包含在array2中。
還有一個(gè)問題需要解決:當(dāng)前的Product的Categories屬性值只存儲(chǔ)了所有第三級(jí)分類編號(hào)拼接成的字符串,而前端輸入的搜索條件可能會(huì)包含一級(jí)分類或二級(jí)分類等,所以,我們需要把Product轉(zhuǎn)換一下,希望有一個(gè)類的某個(gè)屬性值能存儲(chǔ)由一級(jí)、二級(jí)、三級(jí)分類拼接而成的字符串。
public class ProductWithThreeCate { public int Id { get; set; } public string Name { get; set; } public string AllCategoreis { get; set; } }
以上, AllCategoreis屬性值就用來(lái)存儲(chǔ)由一級(jí)、二級(jí)、三級(jí)分類拼接而成的字符串。
有一個(gè)方法獲取所有分類:
static List<Category> GetCategories() { return new List<Category>() { new Category(){Id = 1, Name = "根", ParentId = -1}, new Category(){Id = 2, Name = "一級(jí)分類1",ParentId = 1}, new Category(){Id = 3, Name = "一級(jí)分類2", ParentId = 1}, new Category(){Id = 4, Name = "二級(jí)分類11",ParentId = 2}, new Category(){Id = 5, Name = "二級(jí)分類12",ParentId = 2}, new Category(){Id = 6, Name = "二級(jí)分類21",ParentId = 3}, new Category(){Id = 7, Name = "二級(jí)分類22",ParentId = 3}, new Category(){Id = 8, Name = "三級(jí)分類111",ParentId = 4}, new Category(){Id = 9, Name = "三級(jí)分類112",ParentId = 4}, new Category(){Id = 10, Name = "三級(jí)分類121",ParentId = 5}, new Category(){Id = 11, Name = "三級(jí)分類122",ParentId = 5}, new Category(){Id = 12, Name = "三級(jí)分類211",ParentId = 6}, new Category(){Id = 13, Name = "三級(jí)分類212",ParentId = 6}, new Category(){Id = 14, Name = "三級(jí)分類221",ParentId = 7} }; }
有一個(gè)方法獲取所有產(chǎn)品:
static List<Product> GetProducts() { return new List<Product>() { new Product(){Id = 1, Name = "產(chǎn)品1",Categories = "10,12"}, new Product(){Id = 2, Name = "產(chǎn)品2", Categories = "12,13"}, new Product(){Id = 3, Name = "產(chǎn)品3",Categories = "10,11,12"}, new Product(){Id = 4, Name = "產(chǎn)品4",Categories = "13,14"}, new Product(){Id = 5, Name = "產(chǎn)品5",Categories = "11,13,14"} }; }
接下來(lái)的方法是根據(jù)搜索條件(比如是"1,2")來(lái)查找滿足條件的ProductWithThreeCate集合,如下:
/// <summary> /// 獲取滿足某些條件的集合 /// </summary> /// <param name="query">以英文逗號(hào)隔開的字符串,比如:2,5</param> /// <returns></returns> static List<ProductWithThreeCate> GetResultByQuery(string query) { //最終結(jié)果 List<ProductWithThreeCate> result = new List<ProductWithThreeCate>(); //臨時(shí)結(jié)果 此時(shí)ProductWithThreeCat的屬性AllCategoreis包含所有一級(jí)、二級(jí)、三級(jí)分類ID拼接成的字符串 List<ProductWithThreeCate> tempResult = new List<ProductWithThreeCate>(); //獲取所有的產(chǎn)品 List<Product> allProducts = GetProducts(); //遍歷這些產(chǎn)品 foreach (var item in allProducts) { ProductWithThreeCate productWithThreeCate = new ProductWithThreeCate(); productWithThreeCate.Id = item.Id; productWithThreeCate.Name = item.Name; //所有一級(jí)、二級(jí)、三級(jí)拼接成以英文逗號(hào)隔開的字符串 string temp = string.Empty; //當(dāng)前產(chǎn)品只包含三級(jí)拼接成的、也是以英文隔開的字符串,split成數(shù)組 string[] theThirdCates = item.Categories.Split(','); //遍歷這些三級(jí)數(shù)組 foreach (string i in theThirdCates) { //三級(jí)類別轉(zhuǎn)換成整型 int theThirdInt = int.Parse(i); //獲取三級(jí)類別 Category theThirdCate = GetCategories().Where(c => c.Id == theThirdInt).FirstOrDefault(); //獲取二級(jí)類別 Category theSecondCate = GetCategories().Where(c => c.Id == theThirdCate.ParentId).FirstOrDefault(); //獲取一級(jí)類別 Category theFirstCate = GetCategories().Where(c => c.Id == theSecondCate.ParentId).FirstOrDefault(); temp += i + "," + theSecondCate.Id.ToString() + "," + theFirstCate.Id.ToString() + ","; } //去掉最后一個(gè)英文逗號(hào) temp = temp.Substring(0, temp.Length - 1); //轉(zhuǎn)換成集合,去除重復(fù)項(xiàng),比如不同的三級(jí)可能有相同的一級(jí)或二級(jí)父類 IEnumerable<string> tempArray = temp.Split(',').AsEnumerable().Distinct(); //所有一級(jí)、二級(jí)、三級(jí)拼接成以英文逗號(hào)隔開的字符串,但已經(jīng)去除了重復(fù)的一級(jí)和二級(jí) string tempagain = string.Empty; //再次遍歷集合拼接成字符串 foreach (var s in tempArray) { tempagain += s + ","; } productWithThreeCate.AllCategoreis = tempagain.Substring(0, tempagain.Length - 1); tempResult.Add(productWithThreeCate); } //遍歷臨時(shí)結(jié)果 foreach (var item in tempResult) { //把當(dāng)前包含一級(jí)、二級(jí)、三級(jí)的,以英文逗號(hào)隔開的字符串split成數(shù)組 string[] itemArray = item.AllCategoreis.Split(','); //把當(dāng)前查詢字符串split成數(shù)組 string[] queryArray = query.Split(','); //如果queryArray的每一個(gè)元素都被包含在itemArray中,那就保存起來(lái) if (queryArray.All(x => itemArray.Contains(x)) == true) { result.Add(item); } } return result; }
客戶端的調(diào)用如下:
List<ProductWithThreeCate> result = GetResultByQuery("2,5"); //遍歷最終的結(jié)果 foreach (var item in result) { Console.WriteLine(item.Name+ " " + item.AllCategoreis); } Console.ReadKey();
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- ASP.NET MVC使用正則表達(dá)式驗(yàn)證手機(jī)號(hào)碼
- ASP.NET?MVC實(shí)現(xiàn)登錄后跳轉(zhuǎn)到原界面
- ASP.NET?MVC使用jQuery的Load方法加載靜態(tài)頁(yè)面及注意事項(xiàng)
- ASP.NET MVC解決上傳圖片臟數(shù)據(jù)的方法
- ASP.NET?MVC使用JSAjaxFileUploader插件實(shí)現(xiàn)單文件上傳
- ASP.NET?MVC實(shí)現(xiàn)單個(gè)圖片上傳、限制圖片格式與大小并在服務(wù)端裁剪圖片
- ASP.NET?MVC使用Boostrap實(shí)現(xiàn)產(chǎn)品展示、查詢、排序、分頁(yè)
- ASP.NET?MVC使用typeahead.js實(shí)現(xiàn)輸入智能提示功能
- ASP.NET?MVC實(shí)現(xiàn)城市或車型三級(jí)聯(lián)動(dòng)
- ASP.NET?MVC實(shí)現(xiàn)區(qū)域或城市選擇
相關(guān)文章
.NET實(shí)現(xiàn)魔方游戲(一)之任意階魔方的表示
這篇文章主要介紹了.NET實(shí)現(xiàn)魔方游戲(一)之任意階魔方的表示 的相關(guān)資料,需要的朋友可以參考下2016-02-02ASP.NET簡(jiǎn)化編輯界面解決思路及實(shí)現(xiàn)代碼(2)
這篇與前一篇改進(jìn)部分,也許大家會(huì)留意到動(dòng)畫演示,主要是GridVeiw的更新與刪除會(huì)在每row都有。因此Insus.NET把它抽取出來(lái),放在GridView外,感興趣的朋友可以了解下啊,希望本文對(duì)你有所幫助2013-01-01asp.net Parameters.AddWithValue方法在SQL語(yǔ)句的 Where 字句中的用法
今天晚上看論壇,有人提問說,Parameters.AddWithValue方法在有些情況下不好使2009-01-01asp.net 無(wú)刷新分頁(yè)實(shí)例代碼
asp.net 無(wú)刷新分頁(yè)實(shí)例代碼,需要的朋友可以參考一下2013-03-03asp.net關(guān)于Cookie跨域(域名)的問題
Cookie是一個(gè)偉大的發(fā)明,它允許Web開發(fā)者保留他們的用戶的登錄狀態(tài)。但是當(dāng)你的站點(diǎn)有一個(gè)以上的域名時(shí)就會(huì)出現(xiàn)問題了。在Cookie規(guī)范上說,一個(gè)cookie只能用于一個(gè)域名,不能夠發(fā)給其它的域名。因此,如果在瀏覽器中對(duì)一個(gè)域名設(shè)置了一個(gè)cookie,這個(gè)cookie對(duì)于其它的域名將無(wú)效。如果你想讓你的用戶從你的站點(diǎn)中的其中一個(gè)進(jìn)行登錄,同時(shí)也可以在其它域名上進(jìn)行登錄,這可真是一個(gè)大難題。2012-12-12asp.net 數(shù)據(jù)綁定的實(shí)例代碼
這篇文章介紹了asp.net 數(shù)據(jù)綁定的實(shí)例代碼,有需要的朋友可以參考一下2013-07-07URL重寫及干掉ASP.NET試圖狀態(tài)的實(shí)現(xiàn)方法
URL重寫已經(jīng)很普遍了,但基本上大部分的URL重寫都不支持頁(yè)面的相對(duì)路徑,所有如果想在已經(jīng)開發(fā)好的項(xiàng)目中添加還是有壓力的,第二就是例如微軟的那個(gè)URL重寫是根據(jù)正則表達(dá)式來(lái)處理的,那樣是很好,但也有不足之處,就是不方便定位到某個(gè)頁(yè)面只能有哪些參數(shù)2011-11-11