我有一个名为View Browse.chtml的用户可以输入搜索字词,或者将搜索字词留空.输入搜索词时,我想将页面指向http://localhost:62019/Gallery/Browse/{Searchterm}  ,当没有输入任何内容时,我想将浏览器指向http://localhost:62019/Gallery/Browse/Start/Here.
当我尝试这个时,我得到错误:
控制器类型"GalleryController"上当前的"浏览"请求在以下操作方法之间不明确:System.Web.Mvc.ActionResult类型AutoApp_MVC.Controllers.GalleryController上的浏览(System.String)System.Web.Mvc.ActionResult浏览(Auto32_MVC.Controllers.GalleryController类型上的(Int32,System.String)
我正在用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);
}
Run Code Online (Sandbox Code Playgroud)
我在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
         });
Run Code Online (Sandbox Code Playgroud)
    dan*_*wig 157
在控制器上最多只能有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
     });
Run Code Online (Sandbox Code Playgroud)
......在控制器中......
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);
}
Run Code Online (Sandbox Code Playgroud)
您还可以通过将属性应用于一个来区分它,从而在控制器中保持命名相同的操作方法[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);
}
Run Code Online (Sandbox Code Playgroud)
        我不知道这个问题何时被问到这个解决方案可用,但您可以使用:
Request.QueryString["key"]
Run Code Online (Sandbox Code Playgroud)
所以这应该可以很好地解决您的问题:
[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);
} 
Run Code Online (Sandbox Code Playgroud)
        小智 5
在 RouteConfig.cs 中默认路由前添加以下代码
routes.MapMvcAttributeRoutes();
Run Code Online (Sandbox Code Playgroud)
并在控制器中添加路由属性,如:
    [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>");
    }
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           67013 次  |  
        
|   最近记录:  |