小编典典

路由:以下操作方法之间当前的操作要求[…]不明确

c#

我有一个名为的视图Browse.chtml,用户可以在其中输入搜索词,也可以将搜索词留空。输入搜索词时,我要将页面定向到http://localhost:62019/Gallery/Browse/{Searchterm}
,而没有输入任何内容时,我要将浏览器定向到http://localhost:62019/Gallery/Browse/Start/Here

当我尝试这个时,我得到了错误:

在以下操作方法之间,当前对控制器类型“
GalleryController”采取的“浏览”操作请求不明确:类型为AutoApp_MVC.Controllers.GalleryController的System.Web.Mvc.ActionResult
Browse(System.String)System.Web.Mvc.ActionResult浏览(Int32,System.String)在类型AutoApp_MVC.Controllers.GalleryController上

我使用MVC所做的一切都是第一次。我不确定目前还有什么尝试。

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

public ActionResult Browse(string name1, string name2)
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}

我在Global.asax.cs中也有这个:

    routes.MapRoute(
         "StartBrowse",
         "Gallery/Browse/{s1}/{s2}",
         new
         {
             controller = "Gallery",
             action = "Browse",
             s1 = UrlParameter.Optional,
             s2 = UrlParameter.Optional
         });



    routes.MapRoute(
         "ActualBrowse",
         "Gallery/Browse/{searchterm}",
         new
         {
             controller = "Gallery",
             action = "Browse",
             searchterm=UrlParameter.Optional
         });

阅读 373

收藏
2020-05-19

共1个答案

小编典典

在一个控制器上,您最多只能有两个具有相同名称的操作方法,而要做到这一点,必须为1 [HttpPost],另一个必须为[HttpGet]

由于两种方法都是GET,因此您应该重命名其中一种操作方法或将其移至其他控制器。

尽管您的2个浏览方法是有效的C#重载,但MVC操作方法选择器无法确定要调用的方法。它将尝试将路由与该方法匹配(反之亦然),并且该算法不是强类型的。

您可以使用指向不同操作方法的自定义路由来完成所需的操作:

…在Global.asax中

routes.MapRoute( // this route must be declared first, before the one below it
     "StartBrowse",
     "Gallery/Browse/Start/Here",
     new
     {
         controller = "Gallery",
         action = "StartBrowse",
     });

routes.MapRoute(
     "ActualBrowse",
     "Gallery/Browse/{searchterm}",
     new
     {
         controller = "Gallery",
         action = "Browse",
         searchterm = UrlParameter.Optional
     });

…以及在控制器中…

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

public ActionResult StartBrowse()
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}

您还可以通过将属性应用于一个属性来区分它,从而在控制器中使名称相同的动作方法保持相同[ActionName]。使用与上述相同的Global.asax,您的控制器将如下所示:

public ActionResult Browse(string id)
{
    var summaries = /* search using id as search term */
    return View(summaries);
}

[ActionName("StartBrowse")]
public ActionResult Browse()
{
    var summaries = /* default list when nothing entered */
    return View(summaries);
}
2020-05-19