【问题标题】:ASP.NET MVC Query string not showing in UrlASP.NET MVC 查询字符串未显示在 URL 中
【发布时间】:2016-05-05 14:31:07
【问题描述】:
@using (Ajax.BeginForm("Search", "Filter", new { Area = "Music" }, new AjaxOptions { HttpMethod = "GET", InsertionMode = InsertionMode.Replace, UpdateTargetId = "body-wrapper", OnSuccess = "updateHistory" }, new { @id = "search" }))
{
      <div>
           <i class="fa fa-search"></i>
           <input id="searchString" name="searchString" type="search" placeholder="Search">
      </div>
}

区域注册:

 context.MapRoute(
     "Music_default",
     "Music/{controller}/{action}/{category}",
     defaults: new { controller = "Home", action = "Index", category = UrlParameter.Optional }
 );

全局路由配置:

routes.MapRoute(
     name: "Default",
     url: "{area}/{controller}/{action}/{category}",
     defaults: new { area = "Music", controller = "Home", action = "Index", category = UrlParameter.Optional }
).DataTokens.Add("area", "Music");

控制器:

public ActionResult Search(string searchString)
{
    //Do search stuff
}

每当用户输入搜索输入并提交时,Url 始终为:/Music/Filter/Search,而不是 /Music/Filter/Search/{queryStringHere}

如何显示用户在 url 中输入的查询? searchString 已正确绑定,但只是未显示在 url 中。

这是我在区域注册中尝试过的,但由于某种原因它没有映射到这个:

context.MapRoute(
     "Music_Search",
     "Music/Filter/Search/{searchString}",
     defaults: new { controller = "Filter", action = "Search" }
);

这是当我输入搜索词'Maid'时根据RouteDebugger生成的Url:

生成的网址:/User/Filter/Search?searchString=Maid&X-Requested-With=XMLHttpRequest&_=1462458566832

编辑: RouteDebugger 图像,它没有调用正确的路由配置,因为它似乎没有将查询字符串附加到 RouteData:

【问题讨论】:

  • 这是哪个版本的 MVC?
  • 因为你是 5 岁或以上,如果可能的话,我建议使用属性路由而不是路由配置。这是一个完整的旁注,可能不会解决这个问题,但从长远来看,你会过得更好。 blogs.msdn.microsoft.com/webdev/2013/10/17/…

标签: c# asp.net asp.net-mvc routes


【解决方案1】:

浏览器对您的路由定义(即服务器端代码)一无所知,&lt;form&gt;method="get" 中的值始终作为查询字符串值添加。

根本不可能生成User/Filter/Search/Maid,除非您在BeginForm() 方法中添加路由值,或者您之前使用javascript/jquery 更新&lt;form&gt;action 属性提交表单。

【讨论】:

    【解决方案2】:

    试试这个。更改您的 Route 以接受可选的 searchString 参数:

    routes.MapRoute(
         name: "Default",
         url: "{area}/{controller}/{action}/{category}/{searchString}",
         defaults: new { area = "Music", controller = "Home", action = "Index", category = UrlParameter.Optional, searchString = UrlParameter.Optional }
    ).DataTokens.Add("area", "Music");
    

    然后在您的Ajax.BeginForm 中将searchString 作为第三个参数传递:

    @using (Ajax.BeginForm("Search", "Filter", new { Area = "Music" }, new AjaxOptions { HttpMethod = "GET", InsertionMode = InsertionMode.Replace, UpdateTargetId = "body-wrapper", OnSuccess = "updateHistory" }, new { @id = "search" }))
    {
      // Or pass the value as input
      <input type="text" id="searchString" name="searchString" value="@item.Quantity"/>
     <input type="submit" />
    }
    

    【讨论】:

    • searchString = "MySearch" 如果我这样做,确实会传递到 url,所以 url 变为:/Music/Filter/Search/MySearch 但我需要它是用户可以输入的自定义搜索词,无论他们在由于某种原因似乎没有显示在 url 中的输入。此外,我认为该确切的代码不起作用,因为 Area="Music" 必须在第三个参数中
    • 试过了,还是一样的问题。添加了要发布的路由调试器图像。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    相关资源
    最近更新 更多