![](/img/trans.png)
[英]The current request for action […] on controller type '…' is ambiguous between the following action methods
[英]Routing: The current request for action […] is ambiguous between the following action methods
我有一個名為Browse.chtml
的視圖,用戶可以在其中輸入搜索詞,或將搜索詞留空。 輸入搜索詞時,我想將頁面定向到http://localhost:62019/Gallery/Browse/{Searchterm}
,當沒有輸入時,我想將瀏覽器定向到http://localhost:62019/Gallery/Browse/Start/Here
。
當我嘗試這個時,我收到錯誤:
當前對控制器類型“GalleryController”的“瀏覽”操作請求在以下操作方法之間存在歧義: System.Web.Mvc.ActionResult Browse(System.String) on type AutoApp_MVC.Controllers.GalleryController System.Web.Mvc.ActionResult Browse (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
});
一個控制器上最多只能有 2 個同名的操作方法,為此,1 個必須是[HttpPost]
,另一個必須是[HttpGet]
。
由於您的兩個方法都是 GET,您應該重命名其中一個操作方法或將其移動到不同的控制器。
盡管您的 2 個 Browse 方法是有效的 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);
}
我不知道這個問題何時被問到這個解決方案可用,但您可以使用:
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);
}
在 RouteConfig.cs 中默認路由前添加以下代碼
routes.MapMvcAttributeRoutes();
並在控制器中添加路由屬性,如:
[Route("Cars/deteals/{id:int}")]
public ContentResult deteals(int id)
{
return Content("<b>Cars ID Is " + id + "</b>");
}
[Route("Cars/deteals/{name}")]
public ContentResult deteals(string name)
{
return Content("<b>Car name Is " + name + "</b>");
}
我認為重點是您不需要使用請求類隱式測試查詢字符串參數。
MVC 為您進行映射(除非您對 MVC 路由進行了重大更改)。
因此一個動作鏈接路徑
/umbraco/Surface/LoginSurface/Logout?DestinationUrl=/home/
將自動可用於您的(表面)控制器並定義參數:
public ActionResult Logout(string DestinationUrl)
MVC 完成了這項工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.