2011-04-04 74 views
1

親愛的,我有一個簡單的問題,我找不到答案。我創建了一個在url中傳遞不同數據操作值的列表視圖。我目前的網址是這樣的:http://localhost/App/Product/List?categoryId=2&countryId=us通過url傳遞值 - 數據操作

我有來自不同類別和國家的產品,有誰知道我必須通過哪些價值才能展示來自所有國家的產品或來自所有類別的產品而不是特定的產品?像/列表的categoryId =「」 & countryId =「」

一位同事告訴我,執行以下操作:? 我認爲你應該使用空整型(INT?)作爲一種類型的類別ID參數:

public ActionResult List(int? categoryid, int? page, string countryId) 
{ 
     var products = null; 
     if (categoryid.HasValue && !string.IsNullOrEmpty(countryId)) { 
       products = ProductRepository.FindCategoryProducts(categoryid, countryId).AsPagination(page.GetValueOrDefault(1), 20); 
     } else if (categoryid.HasValue == false && string.IsNullOrEmpty(countryId)) { 
       products = ProductRepository.GetAllProducts(); 
     } else { 
       /// check the other cases here... 

       return View(products); 
     } 
} 

但似乎如果我只有兩個參數是可能的,但有很多parameteres我會有很多if - else如果顯示所有可能性。

這是過濾數據或其他選項存在的唯一方法嗎?

任何幫助將不勝感激。 brgds

更新!!:

嗨傑森,非常感謝你。我有以下控制器:

public ActionResult List(int categoryid, int? page, string countryId) 
     { 
      var products = ProductRepository.FindCategoryProducts(categoryid, countryId).AsPagination(page.GetValueOrDefault(1), 20); 

      return View(products); 
     } 

Productrepository:

public IQueryable<Product> FindCategoryProducts(int categoryId, string countryId) 
     { 
      return from product in db.product 
        where product.CategoryId == categoryId 
        && product.CountryId == countryId 
        orderby product.CreatedOn 
        select product; 
     } 

那麼我可以通過URL產品/列表的categoryId = 2 & countryId =我們。但如果我想檢索所有產品,無論哪個國家/地區喜歡使用可空字符串,我都會收到錯誤。 這就是爲什麼這位同事建議我創建if/elseif語句 - 考慮到所有參數的可能性,但如果作爲一個例子我有8個參數,它似乎是一個很長的聲明。

謝謝!

+1

取決於您如何設置數據庫。如果你有產品X,你是否有每個國家的單獨產品ID?或者你有一個產品ID,然後分別存儲每個國家/地區的信息?沒有更多的細節,沒有人可以爲你解答。這就像是說你從一本書裏得到了一個頁面,想知道它的一個字是什麼,但不知道這本書的標題或頁面是什麼。 – 2011-04-04 00:58:12

+0

我發佈了更多的信息,你可以看到下面,我想知道如何創建一個使用窗體來操作多個參數的數據的列表視圖。像電子商務網站一樣,根據類別,最大最低價格,屬性等進行列表視圖。brgds! – 2011-04-04 01:10:06

回答

2

這不是一個神奇的答案。爲了允許對大量可空標準進行過濾,某處將會有邏輯來確定如何處理空參數。我建議把它作爲ProductRepository的責任,而不是你的頁面的Controller。這使得更容易在其他控制器中重複使用相同的邏輯,而不必複製和粘貼它。

如果你正在使用LINQ,你可以做這樣的事情你Where子句中

where Product == (productParm ?? Product) 

如果您在SQL這樣做,也有類似的操作,您可以使用

where Product = COALESCE(productParm, Product) 

就您提供的查詢而言,假設您有其他字符串屬性A & B可以過濾:

public IQueryable<Product> FindCategoryProducts(int categoryId, string countryId, string filterA, string filterB) 
     { 
      return from product in db.product 
        where product.CategoryId == categoryId 
        && product.CountryId == (String.IsNullOrEmpty(countryId) ? product.CountryID : countryId) 
        && product.PropertyA == (String.IsNullOrEmpty(filterA) ? product.CategoryA : filterA) 
        && product.PropertyB == (String.IsNullOrEmpty(filterB) ? product.CategoryB : filterB) 

        // and so on... 

        orderby product.CreatedOn 
        select product; 
     } 

關於?: operator的更多信息

+0

jason,謝謝......我發佈了更多信息,你可以在下面看到,我想知道如何使用表單來創建一個列表視圖來操作具有多個參數的數據。像電子商務網站一樣,根據類別,最大最低價格,屬性等進行列表視圖。brgds! – 2011-04-04 01:09:40