1

我正在尝试重载 MVC 操作,但由于“重载”不适用于路由操作(错误 500 表示方法不明确,我猜是因为无法从浏览器强类型化参数),所以我想我只会将一个操作返回给另一个操作因为我也不能将 RedirectToAction 用于 HttpPost。问题是它试图找到一个具有新操作名称的视图,而不是我试图调用的 aciton。这是我正在尝试做的事情:

    [HttpPost]
    public ActionResult DetailForProductID(int productID)
    {
        return Detail(new[] { GetProductById(productID) });
    }

    [HttpPost]
    public ActionResult Detail(IEnumerable<Product> products)
    {
       ....
       return View(productViewModel);
    }

这是我得到的错误:

The view 'DetailForProductID' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/Products/DetailForProductID.aspx
~/Views/Products/DetailForProductID.ascx
~/Views/Shared/DetailForProductID.aspx
~/Views/Shared/DetailForProductID.ascx
~/Views/Products/DetailForProductID.cshtml
~/Views/Products/DetailForProductID.vbhtml
~/Views/Shared/DetailForProductID.cshtml
~/Views/Shared/DetailForProductID.vbhtml

处理这个问题的最健壮和优雅的方法是什么?我不想将内容存储在临时会话中或执行 RedirectToAction,因为我应该能够在服务器端完成所有操作。任何帮助或建议将不胜感激。

4

3 回答 3

3

对于这样的重定向,我会推荐以下内容:

return RedirectToAction("Detail", data);

但我不确定你为什么需要这个。看看你的行为,为什么不这样做呢?

public ActionResult Detail(int productId)
{
   var data = GetProductById(productID);
   ....
   return View(productViewModel);
}
于 2012-08-10T16:18:13.857 回答
1

您还可以在这种情况下使用 Tempdata,例如:

public ActionResult DetailForProductID(int productID)
{
    IEnumerable<Product> data =   GetProductById(productID);
    TempData["ProductData"]= data;
    return RedirectToAction("Detail",data);        
}


public ActionResult Detail(IEnumerable<Product> products)
{
   ....
    if(TempData["ProductData"]!=null){
       IEnumerable<Product> data =  (IEnumerable<Product>)TempData["ProductData"];
       return View(data);
    }else {
       return View(products);
    }
}
于 2012-08-10T16:27:09.250 回答
0

我认为保持控制器“瘦”和“哑”很重要。一旦您超越了一个简单的网站并需要构建更复杂的东西,您就不想多次重写相同的代码(由于很多原因不好)。将控制器用作通用功能也将变得不可能(这基本上是您现在尝试做的事情)。

处理这个问题的更优雅和健壮的方法是抽象出你的应用程序逻辑并在其他地方执行它。然后,您可以根据操作的要求调用逻辑片段。要开始朝这个方向发展,您可以在每个控制器中编写控制器特定的逻辑,然后确定它们之间共享的功能并将其放置在项目的其他位置。在更复杂的项目中,控制器中根本没有应用程序逻辑并不罕见。

您可能想尝试创建一个通用函数,该函数可能通过 Id 返回“产品”,并将该函数放在其他地方。然后使用控制器判断具体逻辑,调用共享函数通过Id获取产品。

于 2012-08-10T16:47:23.313 回答