2

目标

创建两个具有相同行为的“不同”方法。

问题

当有人访问我的应用程序时,我想显示一个项目列表——这个列表与myapp.com/products/offers/. 换句话说,我不想在两种方法之间重复相同的代码。所以我问:我该怎么办?

我现在在做什么

HomeController,在Index其类型为 的方法上ActionResult,有以下代码片段:

public ActionResult Index()
{
    return RedirectToAction("Offers", "Products");
}

同时,在ProductsController, onOffers方法:

public ActionResult Offers()
{
    var products = Products.Build.OffersList();
    var categories = Categories.Build.Main();

    ProductsViewModel viewModel = ProductsViewModel
    {
        Products = products,
        Categories = categories
    };

    return View(viewModel);
}

现在需要考虑三件事:

  1. 我的应用程序将客户端重定向到另一个页面,生成第二个服务器请求,浪费带宽;
  2. 应用程序的 URL 从更改myapp.com/myapp.com/Products/Offers/,我真的不想要这个;
  3. 如果我重复代码将是多余的——此外,ProductsController逻辑上不应该存在的东西HomeController

再说一遍:我该怎么办?

4

2 回答 2

6

将通用逻辑移动到“服务”或“帮助”类中:

class ProductListingHelper {
    public ProductsViewModel GetProductsViewModel() {
       var products = Products.Build.OffersList();
        var categories = Categories.Build.Main();

        return new ProductsViewModel() {
            Products = products,
            Categories = categories
        };
    }
}

然后,在您的两个控制器中,执行以下操作:

 return View(new ProductListingHelper().GetProductsViewModel());

请注意,正如 Erik 在评论中指出的那样,这将需要您创建两个视图。但是,您也可以通过将 ProductListView 作为其他两个视图呈现的部分视图来减少此处的重复。

于 2013-08-08T22:56:32.653 回答
2

添加一个类(通常称为“服务”类)并将要重用的代码移动到该类中的方法中(可能调用方法GetProductsViewModel()),然后从每个控制器操作中调用该方法。

希望有帮助。

于 2013-08-08T22:56:38.933 回答