两种具有相同行为的方法

时间:2013-08-08 22:51:27

标签: c# asp.net-mvc-4

目标

使用相同的行为创建两个“不同”的方法。

问题

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

我现在在做什么

HomeControllerIndex方法,其类型为ActionResult,有以下代码的片段:

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

同时,在ProductsControllerOffers方法:

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. 应用程序的网址已从myapp.com/更改为myapp.com/Products/Offers/,我真的不希望这样;
  3. 如果我重复代码,那将是多余的 - 更多的是ProductsController中的某些内容在HomeController上不应该存在逻辑。
  4. 而且,再次: 我该怎么办?

2 个答案:

答案 0 :(得分: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作为其他两个视图呈现的部分视图来减少重复。

答案 1 :(得分:2)

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

希望有所帮助。