我有一个专门的搜索引擎,它通过URL中的长而复杂的查询字符串(37个参数)将搜索条件从“搜索”页面(表单)传递到“结果”页面。它必须以这种方式而不是作为表单发布,因为我想让用户能够通过构建自定义URL来创建自己的搜索查询。
我正在将分页作为URL中的参数处理,而不是作为查询字符串的一部分。例如,“/ Search / Results?keyword =& ...”指向第1页,“/ Search / Results / 6?keyword =& ...”指向第6页,等等。我正在寻找为了一种在页面上保持查询字符串的方法,但我似乎无法找到一种方法让RouteLink将传入的查询字符串“重新附加”到它生成的URL。我见过的一些帖子建议将每个参数明确地附加为“new {}”,但是其中有37个这样的方式不合适。
我真正想要的是这样的东西;
Html.RouteLink("Next", "Default", new { controller = "Search", action = "Results", page = nextPage, Request.QueryString });
但这不起作用。
有什么建议吗?
答案 0 :(得分:3)
这是自定义html助手的好选择:
public static class HtmlExtensions
{
public static IHtmlString MyRouteLink(this HtmlHelper htmlHelper, string linkText, string routeName, object routeValues)
{
var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
var request = htmlHelper.ViewContext.HttpContext.Request;
var url = urlHelper.RouteUrl(routeName, routeValues, request.Url.Scheme);
var uriBuilder = new UriBuilder(url);
var query = HttpUtility.ParseQueryString(string.Empty);
foreach (string key in request.QueryString.Keys)
{
query[key] = request[key];
}
var routeQuery = HttpUtility.ParseQueryString(uriBuilder.Query);
foreach (string key in routeQuery)
{
query[key] = routeQuery[key];
}
uriBuilder.Query = query.ToString();
var anchor = new TagBuilder("a");
anchor.Attributes["href"] = uriBuilder.ToString();
anchor.SetInnerText(linkText);
return new HtmlString(anchor.ToString());
}
}
您将在视图中使用:
@Html.MyRouteLink(
"Next",
"Default",
new {
controller = "Search",
action = "Results",
page = nextPage
}
)
答案 1 :(得分:0)
这个怎么样:
<a href="@Url.RouteUrl(new
{
controller = "Search",
action = "Results",
page = nextPage
}
)?@Request.QueryString">Next</a>
答案 2 :(得分:0)
创建一个ActionLink Extension,它将为路由值添加查询字符串, 像..
public static class LinkExtensions
{
public static string MyActionLink(this HtmlHelper helper,string actionName,string controllerName,string linkText)
{
var qs =helper.ViewContext.HttpContext.Request.QueryString;
RouteValueDictionary dict=new RouteValueDictionary();
qs.AllKeys.ToList().ForEach(k=>dict.Add(k,qs[k]));
UrlHelper urlhelper = new UrlHelper(helper.ViewContext.RequestContext);
string url = urlhelper.Action(actionName, controllerName, dict);
TagBuilder tagBuilder = new TagBuilder("a")
{
InnerHtml = (!String.IsNullOrEmpty(linkText)) ? HttpUtility.HtmlEncode(linkText) : String.Empty
};
tagBuilder.MergeAttribute("href", url);
return tagBuilder.ToString(TagRenderMode.Normal);
}
}
在视图中,您可以将其用作
@ Html.MyActionLink(“索引”,“主页”,“链接到主页”)