Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I access query string parameters in asp.net mvc?

I want to have different sorting and filtering applied on my view I figured that I'll be passing sorting and filtering params through query string:

@Html.ActionLink("Name", "Index", new { SortBy= "Name"})

This simple construction allows me to sort. View comes back with this in query string:

?SortBy=Name

Now I want to add filtering and i want my query string to end up with

?SortBy=Name&Filter=Something

How can I add another parameter to list of already existing ones in ActionLink? for Example:

user requests /Index/

view has

 @Html.ActionLink("Name", "Index", new { SortBy= "Name"})

and

 @Html.ActionLink("Name", "Index", new { FilterBy= "Name"})

Links: The first one looks like /Index/?SortBy=Name and The second is /Index/?FilterBy=Name

I want when user pressed sorting link after he applied some filtering - filtering is not lost, so i need a way to combine my params. My guess is there should be a way to not parse query string, but get collection of parameters from some MVC object.

like image 779
Alexander Taran Avatar asked Feb 27 '09 08:02

Alexander Taran


People also ask

What is query string in ASP.NET MVC?

Generally, the query string is one of client-side state management techniques in ASP.NET in which query string stores values in URL that are visible to Users. We mostly use query strings to pass data from one page to another page in asp.net mvc. In asp.net mvc routing has support for query strings in RouteConfig.


2 Answers

so far the best way I figured out is to create a copy of ViewContext.RouteData.Values and inject QueryString values into it. and then modify it before every ActionLink usage. still trying to figure out how to use .Union() instead of modifying a dictionary all the time.

<% RouteValueDictionary   tRVD = new RouteValueDictionary(ViewContext.RouteData.Values); %>

<% foreach (string key in Request.QueryString.Keys )
    {
         tRVD[key]=Request.QueryString[key].ToString();
    } %>

<%tRVD["SortBy"] = "Name"; %>
                <%= Html.ActionLink("Name", "Index", tRVD)%>
like image 125
Alexander Taran Avatar answered Sep 25 '22 19:09

Alexander Taran


My solution is similar to qwerty1000's. I created an extension method, ActionQueryLink, that takes in the same basic parameters as the standard ActionLink. It loops through Request.QueryString and adds any parameters found to the RouteValues dictionary that are not already present (so we can overwrite the original query string if needed).

To preserve the existing string but not add any keys the usage would be:

<%= Html.ActionQueryLink("Click Me!","SomeAction") %>

To preserve the existing string and add new keys the user would be:

<%= Html.ActionQueryLink("Click Me!","SomeAction", new{Param1="value1", Param2="value2"} %>

The code below is for the two usages, but it should be pretty easy to add other overloads to match the other ActionLink extensions as needed.

    public static string ActionQueryLink(this HtmlHelper htmlHelper,
        string linkText, string action)
    {
        return ActionQueryLink(htmlHelper, linkText, action, null);
    }

    public static string ActionQueryLink(this HtmlHelper htmlHelper, 
        string linkText, string action, object routeValues)
    {
        var queryString =
            htmlHelper.ViewContext.HttpContext.Request.QueryString;

        var newRoute = routeValues == null 
            ? htmlHelper.ViewContext.RouteData.Values 
            : new RouteValueDictionary(routeValues);

        foreach (string key in queryString.Keys)
        {
            if (!newRoute.ContainsKey(key)) 
                newRoute.Add(key, queryString[key]);
        }
        return HtmlHelper.GenerateLink(htmlHelper.ViewContext.RequestContext,
            htmlHelper.RouteCollection, linkText, null /* routeName */, 
            action, null, newRoute, null);
    }
like image 12
Brian Cauthon Avatar answered Sep 23 '22 19:09

Brian Cauthon