2009-05-20 11 views
12

Was ist eine gute Möglichkeit, querystring Werte in asp.net mvc persistent?Wie beibehalten Sie querystring Werte in asp.net mvc?

Wenn ich eine URL: /Fragen page = 2 & sort = neueste & Artikel = 50 & showcomments = 1 & search = abcd

Auf Paging-Links, die ich diese Abfragezeichen Werte in alle behalten wollen Links, so dass sie fortbestehen, wenn der Benutzer klickt auf die „nächste Seite“ zum Beispiel (in diesem Fall der Wert Seite würde sich ändern, aber der Rest gleich bleiben würde)

ich 2 Möglichkeiten denken kann, dies zu tun:

  1. Request.Querystring in der Ansicht und fügen Sie die Werte zu den Links
  2. jeweils vom Regler Abfragezeichenfolgeflag Wert Pass zurück in die Ansicht mit Viewdata

Ist man besser als die andere? Sind das die einzigen Möglichkeiten oder gibt es einen besseren Weg?

Antwort

6

Ich würde die Abfrage-Zeichenfolge in der Ansicht (Ihre Option # 1) verarbeiten, anstatt sie die Weitergabe von der Steuerung aus. Dieser Ansatz macht die Ansicht eigenständiger, sodass Sie sie in ein Ansichtssteuerelement konvertieren und in verschiedenen Ansichten wiederverwenden können.

Hinweis: Der direkte Zugriff auf den QueryString in der Ansicht kann als Verstoß gegen das Konstruktionsprinzip der Trennung von Modell und Ansicht erscheinen. In Wirklichkeit handelt es sich jedoch um Navigationsaspekte, die mit der Ansicht in Zusammenhang stehen Modell.

+0

Danke für die Eingabe und Argumentation. Ihre Notiz ist genau der Grund, warum ich daran gedacht habe, ViewData zu übergeben. – dtc

1

Ich würde nur die Werte in der Sitzung auf diese Weise behalten die Paging-Links müssen nur haben;

/Fragen? Page = 2

/Fragen? Page = 3

Der einzige Grund, warum ich würde nicht wir die Abfrage-Zeichenfolge ist, weil ich das sehen, nicht der Benutzer will Werte, die ich an das Programm übergebe. Es ist viel zu einfach für sie, in die Adresszeile zu gehen und die Werte zu ändern, um zu sehen, was passiert. Mit diesem Code können sie nur die Seitennummer ändern.

+0

Das ist etwas, an das ich eine Sekunde gedacht habe, aber wollte es in der Querystring behalten. – dtc

+0

ein guter Grund, den Sie verlassen möchten & sort = next & items = 50 & showcomments = 1 & search = abcd in der Querystring ist so, dass Leute die Suche mit einem Lesezeichen versehen können.Gibt es einen Grund, warum Sie nicht möchten, dass Personen den Wert & search = im Abfragevorgang direkt bearbeiten und sehen, was passiert? –

8

i verwenden, um eine Erweiterungsmethode für die:

public static string RouteLinkWithExtraValues(
     this HtmlHelper htmlHelper, 
     string name, 
     object values) 
    { 
     var routeValues = new RouteValueDictionary(htmlHelper.ViewContext.RouteData.Values); 

     var extraValues = new RouteValueDictionary(values); 
     foreach (var val in extraValues) 
     { 
      if (!routeValues.ContainsKey(val.Key)) 
       routeValues.Add(val.Key, val.Value); 
      else 
       routeValues[val.Key] = val.Value; 
     } 

     foreach (string key in htmlHelper.ViewContext.HttpContext.Request.Form) 
     { 
      routeValues[key] = htmlHelper.ViewContext.HttpContext.Request.Form[key]; 
     } 

     foreach (string key in htmlHelper.ViewContext.HttpContext.Request.QueryString) 
     { 
      if (!routeValues.ContainsKey(key) && htmlHelper.ViewContext.HttpContext.Request.QueryString[key] != "") 
       routeValues[key] = htmlHelper.ViewContext.HttpContext.Request.QueryString[key]; 
     } 

     var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext); 

     return string.Format("<a href=\"{0}\">{1}</a>", urlHelper.RouteUrl(routeValues), name); 
    } 
+0

Ich habe nie darüber nachgedacht. Es sieht interessant aus, aber vielleicht zu kompliziert für mich. Ich hatte gehofft, dass es eine MVC-Konvention gibt, die dies tut, ohne Codezeilen schreiben zu müssen. – dtc

+0

Super! : thumbsup: – Haroon

0

Hier ist, wie ich es in Asp.Net Kern getan, zuerst die Query-String-Parameter ViewBags in Ihrem Controller zuweisen:

[HttpGet("/[controller]/[action]/{categoryId?}/{contractTypeId?}/{locationId?}")] 
public IActionResult Index(Guid categoryId, int contractTypeId, Guid locationId) 
{ 
    ViewBag.CategoryId = categoryId; 
    ViewBag.ContractTypeId = contractTypeId; 
    ViewBag.LocationId = locationId; 

    ... 
} 

dann die Werte auf Ihre Links passieren wie so:

<a asp-action="Index" asp-controller="Jobs" 
    asp-route-categoryId="@teachingCategory.Id" 
    asp-route-contractTypeId="@ViewBag.ContractTypeId" 
    asp-route-locationId="@ViewBag.LocationId"> 
    @teachingCategory.Description (@teachingCategory.Rank) 
</a> 

<a asp-action="Index" asp-controller="Jobs" 
    asp-route-categoryId="@ViewBag.CategoryId" 
    asp-route-contractTypeId="@typeOfEmployment.Id" 
    asp-route-locationId="@ViewBag.LocationId"> 
    @typeOfEmployment.Name 
</a> 

<a asp-action="Index" asp-controller="Jobs" 
    asp-route-categoryId="@ViewBag.CategoryId" 
    asp-route-contractTypeId="@ViewBag.ContractTypeId" 
    asp-route-locationId="@item.Id"> 
    @item.Id 
</a> 

Beachten Sie, dass jeder Link seinen eigenen tatsächlichen Wert behält und den Rest der Routenwerte über das, was wir an ViewBag übergeben haben, weitergibt.

Verwandte Themen