首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >路由:当前的操作请求[...]在下列操作方法之间不明确

路由:当前的操作请求[...]在下列操作方法之间不明确
EN

Stack Overflow用户
提问于 2012-05-20 03:12:51
回答 4查看 80.7K关注 0票数 104

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

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

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

我使用MVC所做的一切都是第一次。在这一点上,我不确定还能尝试什么。

代码语言:javascript
复制
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中也有这个:

代码语言:javascript
复制
    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
         });
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-20 04:14:09

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

因为您的两个方法都是GET,所以您应该重命名其中一个操作方法,或者将其移动到不同的控制器。

虽然您的两个Browse方法是有效的C#重载,但method方法选择器无法确定要调用哪个方法。它将尝试将路由匹配到该方法(反之亦然),并且该算法不是强类型的。

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

..。在Global.asax中

代码语言:javascript
复制
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
     });

..。在控制器里..。

代码语言:javascript
复制
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]属性应用于某个属性来区分它,从而进行keep the action methods named the same in the controller。使用与上面相同的Global.asax,您的控制器将如下所示:

代码语言:javascript
复制
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);
}
票数 167
EN

Stack Overflow用户

发布于 2015-08-17 23:34:18

我不知道这个问题是什么时候被问到的,这个解决方案是可用的,但你可以使用:

代码语言:javascript
复制
Request.QueryString["key"]

因此,这对您的问题应该很有效:

代码语言:javascript
复制
[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);
} 
票数 5
EN

Stack Overflow用户

发布于 2018-10-20 19:35:30

在默认路由之前在RouteConfig.cs中添加以下代码

代码语言:javascript
复制
routes.MapMvcAttributeRoutes();

在控制器中添加路由属性,如下所示:

代码语言:javascript
复制
    [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>");

    }
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10668105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档