2008-09-23 13 views
8

Angenommen, ich habe eine Seite mit Suchergebnissen. Ich suche nach stackoverflow und es gibt 5000 Ergebnisse, 10 pro Seite. Jetzt finde ich mich dies zu tun beim Bau Links auf dieser Seite:ASP.Net MVC Aktionsparameter zwischen Postbacks beibehalten

<%=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..%> 

ich so nicht, muss ich meine Links mit sorgfältiger Überlegung bauen, was vorher etc .. geschrieben

Was würde ich zu tun ist

<%=Html.BuildActionLinkUsingCurrentActionPostData 
     ("Next", "Search", new { Page = 1}); 

wo das anonyme Wörterbuch überschreibt alles derzeit durch vorherige Aktion festgelegt.

Im Grunde interessiert mich, was die vorherigen Aktionsparameter waren, weil ich es wiederverwenden möchte, es klingt einfach, aber fangen an, Sortierung und viele Suchoptionen hinzuzufügen und es beginnt unordentlich zu werden.

Im wahrscheinlich etwas offensichtlich

+1

Das ist so ein offensichtliches Problem Ich kann nicht glauben, dass das MVC-Team nichts getan hat, um es einfacher zu machen. –

Antwort

1

fehlt Jedes Mal, wenn Sie sich finden, redundanten Code in Ihre Ansichten zu schreiben, write a helper. Der Helfer könnte die Parameter explizit kopieren, wie Sie es gerade tun, oder er könnte die gesamte Sammlung iterieren und automatisch kopieren. Wenn ich es wäre, würde ich wahrscheinlich die erste wählen. Dann können Sie einfach Ihren neuen Helfer anrufen, anstatt die Parameter jedes Mal neu zu erstellen, wenn Sie einen Link erstellen.

1

Ich bin ein wenig zweifelhaft, was Sie hier eigentlich machen wollen. Ich denke, Sie versuchen, den Prozess der Erstellung einer Liste von Links mit nur kleinen Änderungen zwischen ihnen zu automatisieren. Anscheinend in deinem Fall die ID-Nummer von "Page".

Eine Möglichkeit, es zu tun, wenn auch möglicherweise nicht die beste, wie so ist (My Code nutzt eine Grund- und gekünstelt Produktliste und die Viewpage und PartialViewPage beide verwenden Stark Modelle typisierten):

auf Ihrem View Sie würde der Code wie folgt hinzu:

<div id="product_list"> 
     <% foreach (TestMVC.Product product in ViewData.Model) 
      { %> 
      <% Html.RenderPartial("ProductEntry", product); %> 
     <% } %> 
</div> 

Ihre Teilansicht, in meinem Fall "ProductEntry", würde dann wie folgt aussehen:

<div class="product"> 
    <div class="product-name"> 
     <%= Html.ActionLink(ViewData.Model.ProductName, "Detail", new { id = ViewData.Model.id })%> 
    </div> 
    <div class="product-desc"> 
     <%= ViewData.Model.ProductDescription %> 
    </div>  
</div> 

Alles, was ich in t mache Hut Teilansicht verbraucht das Modell/Bildschirmtextsystem, die von der übergeordneten Ansicht durch den Aufruf übergeben wurde

In Ihren Eltern im Hinblick auf Html.RenderPartial Sie vor dem Aufruf von Html.RenderPartial, um einen Parameter auf dem Modellobjekt ändern könnten Stellen Sie den spezifischen Wert ein, an dem Sie interessiert sind.

Hoffe, das hilft.

12

Ich hatte ein ähnliches Problem in einem HtmlHelper; Ich wollte Links erzeugen, die mit der aktuellen Seite verlinkt sind, mit einer kleinen Anpassung der Parameter (denke daran, die Seitennummer zu erhöhen). Also, wenn ich URL/Item /? Sort = Name & page = 0 hätte, ich in der Lage sein, Links zu der gleichen Seite zu erstellen, aber nur die Seite Parameter ändern, und die Sortierparameter automatisch enthalten (dh/Item /? sort = Name & Seite = 1).

Meine Lösung war (für die Verwendung in einer Htmlhelper-Erweiterungsmethode, aber da Sie die gleichen Daten in MVC fast überall zugreifen können, können Sie es einfach an Ihre Anwendungen anpassen können):

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; 
} 

das Verfahren Was does nimmt das RouteValueDictionary für die aktuelle Anfrage und erstellt eine Kopie davon. Dann fügt es jeden dieser Abfrageparameter, die in der Abfragezeichenfolge gefunden werden, zu dieser Route hinzu. Es tut dies, weil das RouteValueDictionary der aktuellen Anfrage sie nicht enthält (Sie würden es denken, aber es tut es nicht).

routeValues["page"] = 2; 

und dann das Wörterbuch geben die out-of-the-box-Htmlhelper Methoden für sie zu erzeugen: nur einen Teil davon, zum Beispiel

Sie können die resultierende Wörterbuch dann nehmen, modifizieren eine URL/etc.

+0

die einzige echte Lösung für die Frage, hätte akzeptiert werden sollen. – daniel

+1

Obwohl ich keine andere Möglichkeit sehe, sieht das Kopieren dieser Sammlung nicht sehr hübsch aus. –

1

Hilfsmethode Nach genau das tut:

public static string EnhancedActionLink(this HtmlHelper helper, string linkText, string actionName, string controllerName, bool keepQueryStrings) 
    { 
     ViewContext context = helper.ViewContext; 
     IDictionary<string, object> htmlAttributes = null; 
     RouteValueDictionary routeValues = null; 
     string actionLink = string.Empty; 
     if (keepQueryStrings && context.RequestContext.HttpContext.Request.QueryString.Keys.Count > 0) 
     { 
      routeValues = new RouteValueDictionary(context.RouteData.Values); 
      foreach (string key in context.RequestContext.HttpContext.Request.QueryString.Keys) 
      { 
       routeValues[key] = context.RequestContext.HttpContext.Request.QueryString[key]; 
      } 
     }    
     actionLink = helper.ActionLink(linkText, actionName, controllerName, routeValues, htmlAttributes); 
     return actionLink; 
    } 
0

auf dieser einen Blick, es ist ein gutes Beispiel: http://nerddinnerbook.s3.amazonaws.com/Part8.htm

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. – Smamatti

0

Hier ist die Actionlink-Erweiterung

 

    public static class ActionLinkExtension 
    { 
     public static MvcHtmlString ActionLinkWithQueryString(this HtmlHelper helper, string linkText, string action, string controller, object routeValues) 
     { 
      var context = helper.ViewContext; 

      var currentRouteValues = new RouteValueDictionary(context.RouteData.Values); 
      foreach (string key in context.HttpContext.Request.QueryString.Keys) 
      { 
       currentRouteValues[key] = context.HttpContext.Request.QueryString[key]; 
      } 

      var newRouteValues = new RouteValueDictionary(routeValues); 

      foreach (var route in newRouteValues) 
      { 
       if (!currentRouteValues.ContainsKey(route.Key)) 
       { 
        currentRouteValues.Add(route.Key, route.Value); 
       } 
       else 
       { 
        currentRouteValues[route.Key] = route.Value; 
       } 
      } 

      return helper.ActionLink(linkText, action, controller, currentRouteValues, null); 
     } 

    } 
 
0

Nicht gerade eine Antwort, aber es lohnt sich, darauf hinzuweisen: Wenn Sie die Paging-Funktionalität wünschen, verwenden Sie das PagedList Nuget-Paket (Sie müssen das Rad nicht neu erfinden). Der folgende Link bietet ein wirklich schönes Beispiel für die Verwendung: ASP.NET Tutorial

Dies ist besonders nützlich für Sie, weil Query Strings in der URL beim Wechsel zwischen den Seiten gespeichert werden.

+0

Der Benutzer fragt nach einer Möglichkeit, Sortiervorgänge und Seitenwechsel zu kombinieren, die in diesem Lernprogramm nicht enthalten sind. Es zeigt entweder oder und nicht eine Möglichkeit, sie zu kombinieren, so dass Sie zum Beispiel eine Sortierreihenfolge auf Seite 2 erhalten. Jedes Mal, wenn Sie entweder eine Sortierung oder eine Seite auswählen, wird die andere zurückgesetzt. – Josh

Verwandte Themen