C# 具有相同行为的两种方法 目标

C# 具有相同行为的两种方法 目标,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,创建两个具有相同行为的“不同”方法 问题 当有人访问我的应用程序时,我想显示一个项目列表,该列表与myapp.com/products/offers/提供的列表相同。换句话说,我不想在两个方法之间重复相同的代码所以我问:我必须做什么? 我现在在做什么 在HomeController上,在其类型为ActionResult的Index方法上,有以下代码片段: public ActionResult Index() { return RedirectToAction("Offers", "Pr

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

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

我现在在做什么 在
HomeController
上,在其类型为
ActionResult
Index
方法上,有以下代码片段:

public ActionResult Index()
{
    return RedirectToAction("Offers", "Products");
}
同时,在
ProductsController
上的
提供了方法:

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

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

    return View(viewModel);
}
现在有三件事需要考虑:

  • 我的应用程序将客户端重定向到另一个页面,生成第二个服务器请求,浪费带宽
  • 应用程序的URL从
    myapp.com/
    更改为
    myapp.com/Products/Offers/
    ,我真的不想这样
  • 如果我重复该代码,将是多余的-此外,
    ProductsController
    中的某些内容在
    HomeController
    上按逻辑不应该存在

  • 还有:我必须做什么?

    将公共逻辑移到“服务”或“助手”类中:

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

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

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


    希望这能有所帮助。

    我没有越过@SimonWhitehead的肩膀,我还要提到的是,除非你做额外的工作,否则它需要两个视图(足够简单,但没有提及)。两个相同的视图?认真地oO@GuilhermeOderdenge不完全是。控制器的逻辑可能不同。。普通的东西被移动到助手中。此外,视图可能略有不同。但是,通过将通用产品列表移动到局部视图中,您可以独立地更改周围的视图,同时保持它们之间的产品列表通用。注意,问题只是说“在操作之间有一些重复的逻辑,如何减少重复?”。它没有特别提到它们将是相同的。谢谢,@SimonWhitehead,但我找到了一个(暂时?)解决方案:默认情况下在
    产品
    文件夹上进行
    视图()
    方法搜索。我不知道这是一个好的实践还是一个好的行为,但可以避免冗余。您对此有何看法?这完全取决于您的应用程序的要求。以后,您可能会发现这样更改默认行为很麻烦。。但就性能而言,默认情况下搜索视图的方式没有什么不同。
     return View(new ProductListingHelper().GetProductsViewModel());