ASP.Net MVC在回发之间保持动作参数

8 asp.net-mvc asp.net-mvc-routing

假设我有一个显示搜索结果的页面.我搜索stackoverflow并返回5000个结果,每页10个.现在我发现自己在该页面上构建链接时这样做了:

<%=Html.ActionLink("Page 1", "Search", new { query=ViewData["query"], page etc..%>
<%=Html.ActionLink("Page 2", "Search", new { query=ViewData["query"], page etc..%>
<%=Html.ActionLink("Page 3", "Search", new { query=ViewData["query"], page etc..%>
<%=Html.ActionLink("Next", "Search", new { query=ViewData["query"], page etc..%>
Run Code Online (Sandbox Code Playgroud)

我不喜欢这个,我必须仔细考虑之前发布的内容等来建立我的链接.

我想做的是

<%=Html.BuildActionLinkUsingCurrentActionPostData
        ("Next", "Search", new { Page = 1});
Run Code Online (Sandbox Code Playgroud)

其中匿名字典覆盖当前由上一个操作设置的任何内容.

基本上我关心以前的动作参数是什么,因为我想重用,听起来很简单,但是开始添加排序和加载的高级搜索选项,它开始变得凌乱.

我可能错过了一些明显的东

Dan*_*ers 12

我在HtmlHelper中遇到了类似的问题; 我希望生成链接到当前页面的链接,并对参数进行少量调整(想想增加页码).所以,如果我有URL/Item /?sort = Name&page = 0,我希望能够创建指向同一页面的链接,但只需更改页面参数,并自动包含sort参数(即/ Item /?sort =名称和页面= 1).

我的解决方案就是这个(用于HtmlHelper扩展方法,但由于您几乎可以在MVC中的任何位置访问相同的数据,因此您可以根据自己的需要轻松调整它):

private static RouteValueDictionary CreateRouteToCurrentPage(HtmlHelper html)
{
    RouteValueDictionary routeValues 
         = new RouteValueDictionary(html.ViewContext.RouteData.Values);

    NameValueCollection queryString 
         = html.ViewContext.HttpContext.Request.QueryString;

    foreach (string key in queryString.Cast<string>())
    {
        routeValues[key] = queryString[key];
    }

    return routeValues;
}
Run Code Online (Sandbox Code Playgroud)

该方法的作用是将RouteValueDictionary用于当前请求并创建它的副本.然后,它将查询字符串中找到的每个查询参数添加到此路由.这样做是因为,由于某种原因,当前请求的RouteValueDictionary不包含它们(您认为它会,但它不会).

然后,您可以获取结果字典,仅修改其中的一部分,例如:

routeValues["page"] = 2;
Run Code Online (Sandbox Code Playgroud)

然后将该字典提供给开箱即用的HtmlHelper方法,以便它们为您生成URL/etc.


Cra*_*ntz 1

每当您发现自己在视图中编写冗余代码时,请编写一个 helper。帮助器可以显式复制参数,就像您现在所做的那样,或者它可以迭代整个集合并自动复制。如果是我的话,我可能会选择前者。然后你可以调用你的新助手,而不是每次建立链接时重建参数。