2012-12-28 71 views
0

我想按類別顯示項目。我使用LINQ和一切工作,除了我無法顯示所有項目,無論類別。可能是路由問題,因爲我已經問過關於我使用的linq表達式的問題,它應該沒問題。總之,這裏是我的代碼:asp.net mvc中的路由問題3.按類別顯示項目,但不顯示所有項目

public ViewResult Content(string category, int page = 1) 
    { 
     var model = new StoreContentViewModel 
      { 
      Items = _itemsRepository.GetItems() 
          .Where(i => i.Product.Category == null || 
            i.Product.Category != null && i.Product.Category == category) 
          .OrderBy(i => i.ItemId) 
          .Skip((page - 1) * PageSize) 
          .Take(PageSize) 
          .Select(i => i), 
      } 
    } 

而且RegisterRouts方法的內容:

// without categories 
     routes.MapRoute(
      null, 
      "Store/Content/Page{page}", 
      new { controller = "Store", action = "Content", category = (string)null}, 
      new { page = @"\d+" }); 

     // with categories 
     routes.MapRoute(
      null, 
      "Store/Content/{category}/Page{page}", 
      new { controller = "Store", action = "Content" }, 
      new { page = @"\d+" }); 

     // Default route 
     routes.MapRoute(
      null, 
      "{controller}/{action}", 
      new { controller = "Home", action = "Index"}); 

我很困惑的「有和無類」擊潰的順序。

的事情是,當我輸入網址:

~/Store/Content 

或:不顯示

~/Store/Content/Page1  // or Page2 

項目。但是如果我輸入:

~/Store/Content/Man's-Shoes/Page1 

顯示與「Man's-Shoes」類別相關的項目。

那麼,這個問題與路由或馬氏菌有什麼關係還有另一個問題?

p.s.過去兩天我一直在解決這個問題,所以任何幫助都是合適的。

編輯: 也有這個單元測試失敗。可能它寫得很糟糕。檢查它也。
在我的模型我有項目實體 「包含」 產品和運輸單位:

[TestMethod] 
    public void Can_Filter_Content() 
    {    
     //Arrange 
     private Mock<IItemsRepository> _itemsMock = new Mock<IItemsRepository>(); 
     private Mock<IProductRepository> _productsMock = new Mock<IProductRepository>(); 
     private Mock<IShippingRepository> _shippingMock = new Mock<IShippingRepository>(); 

     _itemsMock.Setup(i => i.GetItems()).Returns(new[] 
      { 
       new Item { ItemId = 1, ProductId = 1, ShippingId = 1}, 
       new Item { ItemId = 2, ProductId = 2, ShippingId = 2}, 
       new Item { ItemId = 3, ProductId = 3, ShippingId = 3}, 
       new Item { ItemId = 4, ProductId = 4, ShippingId = 4} 
      }); 
     _productsMock.Setup(p => p.GetProducts()).Returns(new[] 
      { 
       new Product { ProductId = 1, Category = "shoes"}, 
       new Product { ProductId = 2, Category = "shoes"}, 
       new Product { ProductId = 3, Category = "superShoes"}, 
       new Product { ProductId = 4, Category = "shoes"} 
      }); 

     var controller = new StoreController(_itemsMock.Object, 
      _productsMock.Object, _shippingMock.Object) {PageSize = 2}; 

     // Act 
     Item[] result = ((StoreContentViewModel) controller.Content(null).Model).Items.ToArray(); 
     ViewResult viewResult = controller.Content(null); 

     // Assert 
     Assert.IsTrue(result[0].ItemId == 1 && result[1].ItemId == 2); 
     Assert.AreEqual(result.Length, 2); 

     Assert.AreEqual("", viewResult.ViewName); 
    } 

Mabby這有助於

+0

與您的問題無關,但是'i.Product.Category!= null &&'您的LINQ查詢的一部分是還原劑。 '||'後面的部分只會在類別不爲空時執行。 – Ameen

+0

如果數據庫中沒有項目,該怎麼辦?它會執行沒有上面的行? –

+0

僅當'content'變量爲空或空時,纔會添加'Where'子句? – shahkalpesh

回答

1

應該這樣:

.Where(i => i.Product.Category == null || 
     i.Product.Category != null && i.Product.Category == category) 

是這樣的:

.Where(i => category == null || 
     i.Product.Category != null && i.Product.Category == category) 

當類別爲空時,原始條件說產品類別不是空的地方,並且那個類別匹配null,這將永遠不會工作。新條件說明如果該類別爲空,則不評估條件;否則,匹配類別(「Man's-Shoes」)。

+0

ouu是啊!!!!那就對了!非常感謝你! –