2010-01-04 7 views
7

Ich habe eine ASP.NET MVC-Anwendung vor einiger Zeit erstellt, und nach ein paar Wartungszyklen frage ich mich, ob ich den besten Ansatz für die Verwaltung des Zustands nahm. Alles funktioniert, aber ich habe das Gefühl, dass es einen besseren Weg gibt.Statusverwaltung in ASP.NET MVC

Die Website basiert auf einer Suchfunktionalität, die einige Optionen hat. Ein Benutzer beginnt mit der Nutzung der Website, indem er mehrere Suchoptionen in einem Formular ausfüllt und auf die Schaltfläche "Suchen" klickt. Dieser Button setzt auf die Suchmethode mit allen Suchoptionen als Parameter an die Suchmethoden werden definiert, zB:

public ActionResult Search(string param1, string param2, string param3, int? param3, long? param4) 

Nun ist die Ergebnisseite, die eine Reihe von Links auf es zeigt sich hat, was zu verschiedenen Detailseiten usw. da ich den Suchzustand müssen auf der Detailseite erhalten werden, finde ich mich ActionLinks mit vielen Parametern der ganzen Ort, wie zum Beispiel die Schaffung:

<%=Html.ActionLink("LinkText", "MethodName", new {id="idOfDetailPage", param1=Model.param1, param2=Model.param2, param3=Model.param3, param4=Model.param4}, null)%> 

die meisten der Parameterwerte in jedem Link tun ändere nicht vom aktuellen Stand der Suche, aber ich muss sie übergeben, um andere Links in der Detailseite mit dem c erstellen zu können urrent Suchparameter, wie zum Beispiel "zurück zu den Suchergebnissen".

Wenn ich aufgrund einer neuen Feature-Anfrage einen Suchparameter hinzufügen muss, stelle ich fest, dass ich viele Links sowie alle Controller-Methoden modifiziere, zu denen die Links führen. Hier fühle ich, dass ich einen besseren Weg brauche.

Ich habe darüber nachgedacht, den Sitzungszustand zu verwenden, um die Suchparameter beizubehalten, aber aus irgendeinem Grund dachte dies nicht die beste Sache in ASP MVC zu verwenden und bin deshalb neugierig, wenn es einen anderen, saubereren Weg gibt.

Hinweis: Ich habe auch einen Ansatz versucht, bei dem ich ein stark typisiertes Objekt im ActionLink verwende, aber ich muss immer noch Parameter an das Objekt übergeben, damit es nicht viel besser wird.

Irgendwelche Ideen werden geschätzt.

Antwort

1

Die Verwendung des Sitzungsstatus für diese Art von Sache ist immer ein Ärgernis, da dies bedeutet, dass diese Seiten nicht mit einem Lesezeichen versehen werden können und wenn Sie mehr als einen Tab öffnen möchten, wird es unordentlich.

Sie könnten eine neue SearchParameters Klasse erstellen:

public class SearchParameters 
{ 
    public string Param1 { get; set; } 
    public string Param2 { get; set; } 
} 

ändern Sie Ihre Aktion

public ActionResult Search(SearchParameters params) 

und dann leiten Sie diese zurück in die Ansicht durch die Ansicht Daten zu sein.

Ihrer Ansicht nach sollten dann in der Lage sein

<%=Html.ActionLink("LinkText", "MethodName", Model) %> 

verwenden Wenn Sie diese alle über den Ort mit sind, könnten Sie eine Htmlhelper Erweiterung gerne erstellen:

public static class SearchExtensions 
{ 
    public static string SearchLink<TModel>(this HtmlHelper<TModel> helper, string linkText) 
     where TModel : SearchModel, class //required by ASP.NET MVC 
    { 
     return helper.ActionLink(linkText, "MethodName", modelType.ViewData.Model) %> 
    }  
} 

und dann die Suche ist so einfach wie:

<%=Html.SearchLink("LinkText") %> 
+0

Das funktioniert so lange, wie ich immer die gleichen Suchparameter und nur die Suchparameter zum Akt weitergeben B. die Suchaktion. Ich stehe jedoch in Schwierigkeiten, wenn ich zusätzliche Daten an die Aktion übergeben muss, wie zum Beispiel die ID eines Elements (wie für eine Detailseite).Dann kann ich das Model nicht einfach an die Helper-Methode Html.ActionLink übergeben. Außerdem erfordern viele Links, dass einer der Suchparameter geändert wird, aber der Rest bleibt derselbe. Daher muss ich bei diesem Ansatz weiterhin neue SearchParameters-Objekte erstellen. Es funktioniert, aber es wird nach einer Weile unordentlich. –

+3

Ich werde mich einmischen und vorschlagen, dass die Suche nach Lesezeichen nicht immer eine gute Sache ist - das hängt eher vom Kontext und der Anwendung ab - dies gilt insbesondere, wenn die Suche Abhängigkeiten aufweist, die nicht offengelegt werden in den Parametern. Ich denke, das ist eine gute Verallgemeinerung (-: – Murph