105

我有一个名为 的视图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
         });
4

4 回答 4

168

一个控制器上最多只能有 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);
}
于 2012-05-19T20:14:08.990 回答
6

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

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);
} 
于 2015-08-17T15:34:17.800 回答
5

在默认路由之前的 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>");

    }
于 2018-10-20T11:35:30.053 回答
1

我认为重点是您不需要使用请求类隐式测试查询字符串参数。

MVC 为您进行映射(除非您对 MVC 路由进行了重大更改)。

因此一个actionlink路径

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

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

public ActionResult Logout(string DestinationUrl)

MVC 完成这项工作。

于 2016-09-21T18:54:48.423 回答