路由:当前的行动请求在以下行动方法之间不明确
我有一个名为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完成这项工作。