Jak uzyskać dostęp do parametrów ciągu zapytania w asp.net mvc?
Chcę mieć inne sortowanie i filtrowanie w moim widoku Pomyślałem, że będę przekazywał sortowanie i filtrowanie params przez ciąg zapytania:
@Html.ActionLink("Name", "Index", new { SortBy= "Name"})
Ta prosta konstrukcja pozwala mi sortować. Widok wraca z tym w łańcuchu zapytań:
?SortBy=Name
Teraz chcę dodać filtrowanie i chcę, aby mój ciąg zapytania kończył się
?SortBy=Name&Filter=Something
Jak dodać kolejny parametr do listy już istniejących w ActionLink
? na przykład:
user requests /Index/
Widok has
@Html.ActionLink("Name", "Index", new { SortBy= "Name"})
I
@Html.ActionLink("Name", "Index", new { FilterBy= "Name"})
Linki : pierwszy wygląda jak /Index/?SortBy=Name
a drugi to /Index/?FilterBy=Name
Chcę, gdy użytkownik naciśnięty sortowanie link po zastosowaniu jakiegoś filtrowania-filtrowanie nie jest stracone, więc potrzebuję sposób, aby połączyć moje params. Domyślam się, że powinien być sposób, aby nie parsować ciągu zapytania, ale uzyskać zbiór parametrów z jakiegoś obiektu MVC.
5 answers
Jak na razie najlepszym sposobem na to jest stworzenie kopii ViewContext.RouteData.Values
i wprowadzić do niego wartości QueryString.
a następnie zmodyfikować go przed każdym użyciem ActionLink
.
wciąż próbuję dowiedzieć się, jak używać .Union()
zamiast cały czas modyfikować słownik.
<% 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)%>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-28 06:40:06
Moje rozwiązanie jest podobne do qwerty1000. stworzyłem metodę rozszerzenia ActionQueryLink
, która przyjmuje te same podstawowe parametry, co standard ActionLink
. Zapętla żądanie.QueryString i dodaje wszystkie znalezione parametry do słownika RouteValues
, które nie są jeszcze obecne (więc możemy zastąpić oryginalny ciąg zapytania w razie potrzeby).
Aby zachować istniejący ciąg znaków, ale nie dodać żadnych kluczy, użycie będzie następujące:
<%= Html.ActionQueryLink("Click Me!","SomeAction") %>
Aby zachować istniejący ciąg znaków i dodać nowe klucze, użytkownik be:
<%= Html.ActionQueryLink("Click Me!","SomeAction", new{Param1="value1", Param2="value2"} %>
Poniższy kod dotyczy dwóch zastosowań, ale powinno być dość łatwo dodać inne przeciążenia, aby dopasować inne rozszerzenia ActionLink
w razie potrzeby.
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);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-28 06:41:09
<%= Html.ActionLink("Name", "Index", new { SortBy= "Name", Filter="Something"}) %>
Aby zachować querystring możesz:
<%= Html.ActionLink("Name", "Index",
String.IsNullOrEmpty(Request.QueryString["SortBy"]) ?
new { Filter = "Something" } :
new { SortBy=Request.QueryString["SortBy"], Filter="Something"}) %>
Lub jeśli masz więcej parametrów, możesz zbudować link ręcznie, biorąc pod uwagę Request.QueryString
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-27 09:18:47
Użyj ActionLinkCombined
zamiast ActionLink
public static string ActionLinkCombined(this HtmlHelper htmlHelper, string linkText, string actionName,
object routeValues)
{
var dictionary = new RouteValueDictionary();
foreach (var pair in htmlHelper.ViewContext.Controller.ValueProvider)
dictionary[pair.Key] = pair.Value.AttemptedValue;
if (routeValues != null)
{
foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(routeValues))
{
object o = descriptor.GetValue(routeValues);
dictionary[descriptor.Name] = o;
}
}
return htmlHelper.ActionLink(linkText, actionName, dictionary);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-28 06:41:43
MVC4
@Html.ActionLink("link text","action",new { @id = 5, @name = "textName", @abc = "abc" })
lub
@Html.ActionLink("link text", "action", "controller", new { @id = 5, @name = "textName", @abc = "abc" }, new { @class = "cssClass" })
Querystring będzie jak:
yourDomainRout/action/5?name=textName&abc=abc
To by było class="cssClass"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-04 05:24:33