1

这是我的简单清单:

public class ProductStore
  {
      public List<Product> AllProducts
      {
          get
          {
              return new List<Product>
              {
                  new Product{Name = "Stove 1", Category= "Stoves", ID = 1, Price = 99.99},
                  new Product{Name = "Stove 2", Category= "Fireplaces", ID = 2, Price = 139.50},
                  new Product{Name = "Stove 3", Category= "Stoves", ID = 3, Price = 199.99},
                  new Product{Name = "Stove 4", Category= "Stoves", ID = 4, Price = 29.00},
              };
          }

      }
  }

这就是我在视图中打印这些数据的方式:@model List

@{
    ViewBag.Title = "AllProducts";
}

<h2>AllProducts</h2>
<ul>
@foreach (var product in Model)
{ 
     <li>Name: @product.Name, Category:@product.Category, Price:@product.Price;</li>
}
</ul>

我的问题是:什么是只打印那些元素的最佳方法,即。类别 == 炉子?我知道我可以在 foreach 中将 if 语句与 continue 结合使用,但我想知道,有没有更聪明的方法来做到这一点?

4

3 回答 3

7

纯 MVC 实现可能会将其放在控制器中,但您可以使用这样的 LINQ 查询过滤您循环的产品列表......

@foreach (var product in Model.AllProducts.Where(p => p.Category == "Stoves").ToList())
{ 
     <li>Name: @product.Name, Category:@product.Category, Price:@product.Price;</li>
}
于 2013-10-16T20:57:42.660 回答
4

@foreach (var product in Model.Where(x => x.Category == "Stoves"))

从句法上讲,这是您的做法。但作为一个编程问题,您可能希望以某种方式更改您的设计。您可能希望在将列表传递给视图之前对其进行过滤。

您正在基于 MVC 控制器操作生成视图。这些操作可以采用条件参数,例如查询字符串值,如下所示:

http://host:12345/Controller/Action?category=Stoves

这在操作中被读取为函数参数,您可以使用它来返回实际列表的子集:

public ActionResult ViewProducts(string category = null)
{
    var products = productStore.AllProducts;

    if (category != null)
        products = products.Where(x => x.Category == category);

    return View(products);
}
于 2013-10-16T20:59:51.220 回答
3

另一个进行过滤的属性将是一个不错的选择。

      public List<Product> StoveProducts
      {
          get
          {
              return AllProducts.Where(p => p.Category == "Stoves").ToList();
          }

      }
于 2013-10-16T20:57:03.907 回答