路由:当前的行动请求在以下行动方法之间不明确

我有一个名为Browse.chtml的视图,用户可以在其中inputsearch词,或者将search词留空。 当inputsearch字词时,我想直接将页面指向http://localhost:62019/Gallery/Browse/{Searchterm} ,当没有input时,我想直接将浏览器指向http://localhost:62019/Gallery/Browse/Start/Here

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

当前在控制器types“GalleryController”上的“浏览”操作请求在以下操作方法之间是不明确的:System.Web.Mvc.ActionResulttypes为AutoApp_MVC.Controllers.GalleryController的Browse(System.String)System.Web.Mvc.ActionResult Browse (Int32,System.String)typesAutoApp_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 }); 

一个控制器上最多只能有两个同名的动作方法,为此,1必须是[HttpPost] ,另一个必须是[HttpGet]

由于你的两个方法都是GET,所以你应该重命名其中一个操作方法,或者把它移到不同的控制器。

虽然你的2浏览方法是有效的C#重载,MVC操作方法select器不能找出哪个方法来调用。 它会尝试匹配一个路由到方法(反之亦然),这个algorithm不是强types的。

您可以使用指向不同操作方法的自定义路线完成您想要的操作:

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); } 

我不知道什么时候提出这个问题的解决scheme是可用的,但你可以使用:

 Request.QueryString["key"] 

所以这应该适合你的问题:

 [HttpGet] public ActionResult Browse() { if( Request.QueryString["id"] != null ) var summaries = /* search using id as search term */ else /*assuming you don't have any more option*/ var summaries = /* default list when nothing entered */ return View(summaries); } 

我认为这一点是你不需要隐式testing使用请求类的查询string参数。

MVC为你做映射(除非你在MVC路由上做了大的改动)。

因此,一个actionlinkpath

 /umbraco/Surface/LoginSurface/Logout?DestinationUrl=/home/ 

将自动适用于您的(表面)控制器,并定义参数:

 public ActionResult Logout(string DestinationUrl) 

MVC完成这项工作。