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();
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對的支持。如果你想了解更多相關內容請查看下面相關鏈接
相關文章:
1. ASP.NET MVC使用異步Action的方法2. ASP.NET MVC使用Session會話保持表單狀態3. ASP.Net MVC利用NPOI導入導出Excel的示例代碼4. ASP.NET MVC遍歷驗證ModelState的錯誤信息5. ASP.NET MVC通過勾選checkbox更改select的內容6. 使用EF Code First搭建簡易ASP.NET MVC網站并允許數據庫遷移7. ASP.NET MVC實現登錄后跳轉到原界面8. ASP.NET MVC前臺動態添加文本框并在后臺使用FormCollection接收值9. ASP.NET MVC使用jQuery ui的progressbar實現進度條10. ASP.NET MVC實現樹形導航菜單

網公網安備