Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC 3: Append get parameters on a ActionLink

I'm using the MVCContrib grid to output some data. When I sort a column, I get a url which may look like this:

/?Column=ColumnName&Direction=Ascending

Lets say I want to add links to control how many results are being shown. Spontaneously I would write something like this:

Html.ActionLink("View 10", "Index", new { pageSize = 10 })

... which would give me:

/?PageSize=10

But say I already sorted the grid. In that case I want to save the url parameters, making the new url look something like this:

/?Column=ColumnName&Direction=Ascending&PageSize=10

How can accomplish this?

like image 201
Bridget the Midget Avatar asked Aug 11 '11 10:08

Bridget the Midget


2 Answers

You could include those other parameters when generating the link:

Html.ActionLink(
    "View 10", 
    "Index", 
    new {
        Column = Request["Column"],
        Direction = Request["Direction"],
        pageSize = 10 
    }
)

or write a custom html helper which will automatically include all current query string parameters and append the pageSize parameter:

Html.PaginateLink("View 10", 10)

and here's how the helper could look like:

public static class HtmlExtensions
{
    public static MvcHtmlString PaginateLink(
        this HtmlHelper helper, 
        string linkText, 
        int pageSize
    )
    {
        var query = helper.ViewContext.HttpContext.Request.QueryString;
        var values = query.AllKeys.ToDictionary(key => key, key => (object)query[key]);
        values["pageSize"] = pageSize;
        var routeValues = new RouteValueDictionary(values);
        return helper.ActionLink(linkText, "Index", routeValues);
    }
}
like image 179
Darin Dimitrov Avatar answered Nov 14 '22 16:11

Darin Dimitrov


You can also use solution from question ASP.NET MVC: The right way to propagate query parameter through all ActionLinks. It will allow you to preserve any parameters on any routes you like.

like image 35
Andrey Shchekin Avatar answered Nov 14 '22 16:11

Andrey Shchekin