Frage

Meine unfamiliarity mit dem ASP.NET MVC-Framework und die Sanitär davon haben mich hierher gebracht, und ich schätze die Geduld es für jeden nimmt meine Frage zu lesen und betrachten!

Okay, hier ist das Szenario: Ich habe eine Anwendung, die zahlreiche Seiten mit Gittern hat, die Daten basierend auf Suchanfragen angezeigt werden, Drilldown von anderen Daten, basierend Berichte über kontextspezifischen Daten (dh sie auf einer Detailseite sind für Foo klicken Sie dann auf einen Link, der eine Tabelle von Daten im Zusammenhang mit Foo) zeigt, usw.

Von jedem und all diesen Seiten, die in der ganzen App sind, kann der Benutzer den „Bericht“ speichern oder Gitter durch einen Namen und eine Beschreibung geben. Dieses speichert nicht wirklich die Daten im Raster angezeigt, so viel wie die Parameter speichert, die definieren, was das Gitter aussieht, speichert die Parameter, die verwendet wurden, get die Daten und speichert die Parameter die definieren, „where“ in der Anwendung sind sie (die Aktion, Controller, route.) - im Grunde eine Reihe von Metadaten über den Bericht / grid und wie es zu konstruieren

Alle diese gespeicherten Berichte in einer einzigen Liste zur Verfügung stehen, die Anzeige des Namens und der Beschreibung, auf einer bestimmten Seite in der App, mit jeweils einer generischen URL verknüpft, wie „/ Berichte / Saved / 248“ (wobei 248 ein Beispiel für die ID des Berichts).

Dies ist der Teil, Ich brauche Hilfe auf:

Wenn ich auf die Aktion über die URL erhalten „/ Berichte / Saved / 248“ und ziehen Sie die Metadaten aus der Datenbank für diesen speziellen Bericht, wie kann ich umleiten, dass die Daten und die Anforderung an die gleiche Aktion, Controller und Route verwendet, um die Ansicht anzuzeigen, dass der Bericht ursprünglich von gespeichert wurde? Im Grunde möchte ich den Benutzer den Bericht in der gleichen Ansicht zu betrachten, mit der gleichen URL wie es von gespeichert wurde. Wenn möglich, wäre es schön, für mich in der Lage zu sein, im Grunde zu „rufen“, die gleiche Wirkung, als ob ich einen Methodenaufruf mache.


UPDATE: Leider ist unsere Berichtseiten (dh die Seiten diese Gitter auf erscheinen) sind RESTful URLs nicht verwenden - zum Beispiel haben wir das, was wir eine erweiterte Suche Seite aufrufen, die eine ziemlich große Anzahl von potentiellen Parameter nimmt (fast 30 ), die aus einer Form enthält, Auswahllisten kommen, Textfelder usw. Wenn der Benutzer diese Seite einreicht, wir eine POST zu einer Aktion zu tun, die eine komplexe Art akzeptiert, dass das Modell Bindemittel für uns baut - die gleiche Aktion ist das, was ich nennen will wenn der Benutzer aus der Datenbank eine gespeicherte erweiterte Suche. Das Beispiel verkörpert mein Problem.

Danke

War es hilfreich?

Lösung

Ich denke, dass Sie RedirectToAction mit der Signatur verwenden werden möchten, die eine Routevaluedictionary nimmt. Die Methode, die Sie umleiten müssen in der Lage sein, die Werte aus der Valueprovider auf dem Controller zu ziehen. Es könnte etwa so aussehen:

public ActionResult Saved( int id )
{
    var reportParams = db.Reports.SingleOrDefault( r => r.ID == id );
    if (reportParams == null)
       ...handle error...

    var routeValues = ParamsToRouteValueDictionary( reportParams );

    return RedirectToAction( reportParams.Action, reportParams.Controller, routeValues );
}

private RouteValueDictionary ParamsToRouteValueDictionary( object parameters )
{
     var values = new RouteValueDictionary();
     var properties = parameters.GetType().GetProperties()
                                .Where( p => p.Name != "Action" && p.Name != "Controller" );
     foreach (var prop in properties)
     {
         values.Add( prop.Name, prop.GetValue(parameters,null) );
     }

     return values;
}

Bearbeiten

Unter Verwendung eines Filtermodell als Parameter für Ihre Methode kann tatsächlich erleichtern. Sie müssen nur GET und POST-Versionen Ihrer Aktion.

 [ActionName("People")]
 [AcceptVerbs( HttpVerbs.Get )]
 public ActionResult PeopleDisplay( SearchModel filter )
 {
     return People( filter );
 }

 [AcceptVerbs( HttpVerbs.Post)]
 [ValidateAntiForgeryToken]
 public ActionResult People( SearchModel filter )
 {
     ....
 }

Dann würden Sie in Ihrem db speichern für den Bericht der Filterparameter (nach Namen), die Aktion ( „Menschen“), und der Controller. Die Umleitung Ergebnis wird GET verwenden und auf die PeopleDisplay Verfahren gerichtet werden, die einfach im Wechsel mit den richtigen Parametern die Menschen Methode aufruft. Posting aus dem Formular ruft die Menschen Methode direkt. zwei Methoden verwenden, können Sie die CSRF-Verhinderungsmechanismus verwenden. Sie könnten in der Lage sein, eine Fahne in TempData zu verwenden, um sicherzustellen, dass die GET-Aktion nur über den Umleitungsmechanismus aufgerufen wird, wenn Sie den Zugriff darauf beschränken kümmern.

END EDIT

Eine weitere Alternative wäre einfach die Ansicht zu speichern, wie gut genutzt und stattdessen eine Umleitung zu tun, nur die entsprechende Ansicht machen. Eines der Dinge, die Sie betrachten möchten, ist die Umleitung, das zu tun mit einer URL am Ende werden alle Parameter enthalten, während die View-Rendering wird die URL allein und nur zeigen die gleiche Ansicht wie die URL verwendet verlassen, wenn die Erstellung des Berichts .

Andere Tipps

Sie können die RedirectToAction Methode verwenden eine 301-Weiterleitung an eine bestimmte Aktion-Methode auf jedem Controller zur Ausgabe zusammen mit Route Werte:

ReportMeta meta = _reportDataAccess.Get(id);
return RedirectToAction(meta.Action, meta.Controller, meta.RouteData);

, wo diese Werte sind so etwas wie:

meta.Action = "Bar";
meta.Controller = "Foo";
meta.RouteData = new {
    // possibly settings for the grid
    start = DateTime.Min,
    end = DateTime.Now,
    sort = "Date"
    // you get the idea
};

Natürlich ist die unmittelbare Frage, die ich sehen kann, mit dieser ist, was passiert, wenn Ihr Controller / Action-Methode im Laufe der Zeit ändern, werden die Berichtsdaten ungültig. Aber dann haben Sie wahrscheinlich schon.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top