簡體   English   中英

路由:當前的動作請求 […] 在以下動作方法之間是不明確的

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM