gpt4 book ai didi

c# - 根据当前 URL 生成 URL 并维护 QueryString

转载 作者:行者123 更新时间:2023-11-30 22:32:02 26 4
gpt4 key购买 nike

我有一个显示项目列表的局部 View ,我在几个不同的地方使用这个局部 View 。在这个局部 View 中,我使用了一个分页器 -

@Html.PagedListPager(Model, page => Url.Action(null, new { page = page }))

这会导致分页器显示我正在查看的任何 Action 和 View 的页面 URL。

问题是,在我的搜索页面上,我使用查询字符串作为搜索字符串,而 Url.Action 方法不包含现有的查询字符串参数。

我最终使用/Search?s=bla&page=3 而不是/Search?page=3

如何使用现有的查询字符串生成 url?

编辑:

这是我的代码

    public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");


routes.Add(
"Search",
new SearchRoute("Search", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(
new { controller = "Search", action = "Index" })
});


routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Call", action = "Index", id = UrlParameter.Optional }


);



}

public class SearchRoute : Route
{
public SearchRoute(string url, IRouteHandler routeHandler)
: base(url, routeHandler)
{
}

public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{

System.Diagnostics.Debug.WriteLine(Url);

if (HttpContext.Current != null)
{

string s = HttpContext.Current.Request.QueryString["s"];

if (!string.IsNullOrEmpty(s))
values.Add("s", s);

}

return base.GetVirtualPath(requestContext, values);
}
}

最佳答案

使用自定义路由,您可以保留查询字符串,因为大多数 Url 生成逻辑使用路由来生成 URL。在这种情况下,我正在检查 Request 对象中是否有名为 XXX 的查询字符串,如果它存在,则将其添加到路由中,如果您愿意,可以使其更通用。

using System.Web;
using System.Web.Routing;

public class PreserveQueryStringRoute : Route
{
public PreserveQueryStringRoute(string url, IRouteHandler routeHandler)
: base(url, routeHandler)
{
}

public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
if(HttpContext.Current != null)
{
values = new RouteValueDictionary(values); //this is the bug fix!

if (!string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["XXX"]))
values.Add("XXX", HttpContext.Current.Request.QueryString["XXX"]);

}

var path = base.GetVirtualPath(requestContext, values);
return path;
}
}

按照常规在 global.ascx 中注册路由(尽管可能不是像我下面这样的通用匹配)

        routes.Add(
"Default",
new PreserveQueryStringRoute("{controller}/{action}/{id}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(
new { controller = "Home", action = "Index", id = UrlParameter.Optional })
});

编辑:

好的,这是一个更新..它是一个错误修复,以及一个如何注册路由的示例(请参阅上面的更正代码以获取错误修复)

注册方法如下:

    routes.Add(      
"Search",
new SearchRoute("Search", new MvcRouteHandler())
{
Constraints = new RouteValueDictionary(
new { controller = "Search", action = "Index" })
});

关于c# - 根据当前 URL 生成 URL 并维护 QueryString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8919851/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com