我有以下操作:
public ActionResult ProductList(int category)
{
IEnumerable<Product> productList = repository.Products.Where(p => p.CategoryId == category);
return PartialView("ProductList", productList);
}
public ActionResult CategoryList(int parentCategory)
{
IEnumerable<Category> categoryList = repository.Categories.Where(p => p.ParentCategoryId == parentCategory);
return PartialView("CategoryList", categoryList);
}
构建以下部分视图:
@model POS.Domain.Entities.Product
<div class = "item">
<h3>@Model.Name</h3>
@Model.Description
@Model.Category.Name
<h4>@Model.Price.ToString("c")</h4>
</div>
@model POS.Domain.Entities.Category
<div class = "category" id= "@Model.CategoryId">
<h2>@Model.Name</h2>
<a href='/get-partial-view'>Get Products from the category: @Model.Name </a>
<div class="divResult">
</div>
</div>
并通过以下单元测试进行测试:
[TestMethod]
public void ProductListReturnsAppropriateProducts()
{
// Arrange - create a controller
var controller = new ProductController(_mockRepository.Object);
// Action
var result = (PartialViewResult) controller.ProductList(2);
// Assert
Assert.AreEqual(((IEnumerable<Product>) result.ViewData.Model).Count(), 2);
Assert.IsTrue(((IEnumerable<Product>) result.ViewData.Model).Count(o => o.Name == "P4") == 1);
}
[TestMethod]
public void CategoryListReturnsAppropriateCategories()
{
// Arrange - create a controller
var controller = new ProductController(_mockRepository.Object);
// Action
var result = (PartialViewResult) controller.CategoryList(2);
// Assert
Assert.AreEqual(((IEnumerable<Category>) result.ViewData.Model).Count(), 3);
Assert.IsTrue(((IEnumerable<Category>) result.ViewData.Model).Count(o => o.Name == "C4") == 1);
}
这几乎是完全的重复——我想学习更紧密地遵守DRY原则。
我的操作几乎做同样的事情——除了我需要一个来生成产品列表和一个类别列表。. . (这最终用于生成列出类别的页面,用户可以单击以查看这些类别中的所有产品)。
必须有一种方法可以将这些几乎重复的方法合并为一种可以适当处理产品与类别的方法。我应该如何从拥有这两个单独的动作转变为拥有一个同时处理products
和的动作categories
?