2009-06-02 15 views
4

Ich habe eine Detailseite, die von verschiedenen Orten aufgerufen wird und eine gut lesbare URL wieWie mache ich einen "zurück" -Link?

"www.mypage.com/product/best-product-ever" hat.

Die Aufruf Seiten (Liste der Produkte) haben eine komplexere URL wie:

"www.mypage.com/offers/category/electronic/page/1/filter/manufacturer/sony/sort/price" und

"www.mypage.com/bestseller/this-week".

Wie kann ich einen Backlink von der Detailseite zur aufrufenden Produktliste machen?

  • Ich kann kein Javascript verwenden
  • Ich will nicht die aufrufende Seite in der URL haben, weil es zu lang wird
  • Ich möchte Links zwischen den Seiten wirklich, keine http-post
  • I verwenden, können nicht session

EDIT: session ausgeschlossen ist, denn wenn es 2 Fenster öffnen, dann würden sie die gleiche „Back“ Seite Informationen austauschen können.

Antwort

4

Wie Lee sagte, verwenden Sie den Referrer-Wert:

<a href="<%= Html.Encode(Request.UrlReferrer.ToString()) %>">Back</a> 

Wenn Sie die URL in den Link nicht wollen, weil es zu lange, versuchen, irgendeine Art von einfachen Kompressionsalgorithmus über die URL ausgeführt wird, zeigt das komprimierte Daten als Unicode-Text und dann fügen Sie die komprimierte URL als Parameter an eine Weiterleitungsseite, zB:

<a href="Redirect.aspx?u=compressed_url_goes_here">Back</a> 
0

Haben Sie einen Keks?

Wenn ja, können Sie es dort eingeben oder verwenden, um Ihren eigenen Sitzungsstatus zu erstellen.

0

Ich denke, dies ist eher wie ein "Zurück zu Ergebnissen" dann ein generischer "< < zurück" -Link, weil Sie erwarten würden, dass der generische Link zurück zur genetischen Liste, nicht die stark gefilterte Liste, die Sie beschrieben, richtig ?

Ich weiß nicht, ob dies in Ihrem „no post“ Zustand fällt, aber die einzige Option, die ich sehen kann, ist mit der Detail Aktion sein POST-only ([AcceptVerbs(HttpVerbs.Post)]) und beinhalten einen anderen Parameter wie string fullRoute, die auf die umgewandelt wird 'Link' auf der Detailseite für "Zurück zu den Ergebnissen". Überladen Sie die Detail Aktion fehlt den fullRoute Parameter und haben die überladene Aktion eine GET-Aktion, so dass der POST fullRoute-Wert nicht erforderlich ist (für wenn Benutzer mit dem 'generischen' "Zurück" Link in Ordnung sind). Dies sollte sowohl generische GET-Anforderungen an die Detailseite als auch die POST-Anfrage liefern, die den spezifischen Link "Zurück zu Ergebnissen" für die gefilterte Liste enthalten.

+0

Die Detailaktion kann in meinem Fall kein Beitrag sein. Der Benutzer muss von jeder Detailseite zur gefilterten - sortierten - Seitenliste zurückkehren. Genau wie der Browser-Zurück-Button. –

+0

Haben Sie etwas dagegen, wenn ich frage, warum Sie POST nicht verwenden können? –

2

Was ist mit dem Referrer-Header-Wert?

+1

Referrer ist möglicherweise nicht gesetzt - einige Firmen/Firewalls streichen es von der Anfrage – veggerby

+0

Ich würde für Referer mit einem Fallback zur Kategorie oder etwas so wählen. – schmilblick

1

Hier ist eine verrückte Idee, die ein faire, aber Arbeit erfordern wird und nicht für die Leistung gesund sein (abhängig von Ihre Benutzer) ..aber hier gehen wir:

ein Repository für das Caching Erstellen ‚ListResults‘ (und Draht an die DB zu bestehen bleibt von Ihnen .. mögen oder einfach nur auf dem Server im Speicher verlassen). Kurz gesagt, was dieser Repo tun kann, ist ein ListResult zu speichern, der alles enthält, um den Status der aktuellen Ansicht der Liste beizubehalten, die ein bestimmter Benutzer betrachtet. Dies kann Routen und andere Werte enthalten, aber im Wesentlichen alles, was benötigt wird, um zurück zu dieser bestimmten Seite der gefilterten und sortierten Liste zu gelangen.

Da der Artikel 0-zum Repo hinzugefügt wird, wird ein kleiner eindeutiger Hash/Schlüssel erzeugt, der urlfreundlich sein wird - so etwas wie "k29shjk4" - er wird zusammen mit einem Datums-/Zeitstempel hinzugefügt.

ListResult s sind nur von dem Moment an erhalten, in dem eine Liste die Standardansicht verlässt (dh keine Filterung, Sortierung und Seite 1) - dies hilft in geringem Maße bei der Leistung.

Ein Artikel ListResult kann nie wirklich verwendet werden, aber alle Detail-Aktionsverknüpfungen in der bestimmten Listenansicht haben den Hash-Wert zur Route hinzugefügt. Also ja, es könnte als Querystring enden, aber es wird kurz sein (URL freundlich) und wenn du dich mit Routen mehr herumalbern willst, kannst du es weiter aufräumen.

Für die Navigation "zurück" zur Liste benötigen Sie möglicherweise einen neuen kleinen Controller, der einfach den Hashwert akzeptiert und den Status der Listenansicht (Paging, Filterung und Sortierung eingeschlossen) aus der Suche umleitet/neu erstellt im Repo.

So haben wir die Anforderungen bisher erfüllt: keine Aufrufseite in der URL (in dem Sinne, dass es nicht die ganze Seite - nur ein Hash-Lookup davon); kein POSTing, keine Sitzungen, keine js.

Um die ListResult Repo davon ab, zu groß zu stoppen (und gefährlich: Wenn Sie es an die DB bestehen), Sie ein ASP.NET background service regelmäßig die ‚alten‘ Routen durch den Zeitstempel .. und ‚verlängert‘ verwenden können, um zu beschneiden die Lebensdauer von Routen, die kontinuierlich verwendet werden, indem dem Stempel eines Elements ListResult Zeit hinzugefügt wird, wenn es über den neuen Controller angefordert wird. Keine Notwendigkeit, eine Route unbestimmt fortzusetzen, denn wenn ein Benutzer einen Permalink zu einer Listenansicht möchte, kann er die Route der langen Liste als Lesezeichen speichern.

hoffe das hilft irgendwie

+0

Lassen Sie uns Ihre Lösung dann wissen .. Ich bin fasziniert, wie Sie das lösen werden. Viel Glück –

+0

Dies ist ein guter Weg, wenn Sie ein paar Benutzer haben. Das Projekt, an dem ich arbeite, hat sehr viel Verkehr - deshalb kann ich dieses Vorgehen nicht verwenden. –

Verwandte Themen