2009-11-25 14 views

Antwort

12

Sie beheben sollen Erstellen Sie Ihre Routen ordnungsgemäß in der Routentabelle. ZB .:

routes.MapRoute("MyRoute" ,"{controler}/{id}#{detail}" ,new { controller = "users", action = "index", id = (string)null, detail = "Summary" }); 
0

Ich mache so etwas auf meiner Website here. Aber es ist nicht mit RedirectToRouteResult. RedirectToRouteResult unterstützt nicht die Einbindung eines Ankerteils in die URL.

Sie müssen den Link selbst erstellen und vielleicht sogar die Logik, um die Verarbeitung des Ankerteils zu verarbeiten - wie ich es getan habe. Meine Anwendung versucht, ähnliche Funktionen wie in den Facebook-Fotogalerieansichten zu replizieren. Jeder Link zu einer anderen Seite muss eine eindeutige URL haben, daher verwende ich den Ankerteil. Aber weil es nicht direkt auf eine Route übersetzt, muss ich den Anker Teil der URL manuell auf der Seite analysieren und Ajax verwenden, um den entsprechenden Inhalt zu laden. Das ist, was ich wollte, also funktioniert es für mich.

+1

Das ist es gerade; Ich weiß, dass ich selbst eine URL erstellen kann, aber ich möchte zum Beispiel in meinen Unit-Tests von stark typisierten Checks profitieren. –

+1

ich sehe. Nun, ich denke du bist kein Glück dann –

0

die source code of MVC herunterladen und lesen Sie, wie RedirectToRouteResult arbeitet

Es kann bessere Möglichkeiten, aber eine einfache Vererbung von RedirectToRouteResult und eine Überschreibung von ExecuteResult einem optionalen Ankerteil zu ermöglichen, soll das Problem

5

UrlHelper.GenerateUrl enthält einen Fragmentparameter. Ich habe eine Erweiterungsmethode

 public static string Action(this UrlHelper url, string actionName, string controllerName, string fragment, object routeValues) 
     { 
      return UrlHelper.GenerateUrl(
       routeName: null, 
       actionName: actionName, 
       controllerName: controllerName, 
       routeValues: new System.Web.Routing.RouteValueDictionary(routeValues), 
       fragment: fragment, 
       protocol: null, 
       hostName: null, 
       routeCollection: url.RouteCollection, 
       requestContext: url.RequestContext, 
       includeImplicitMvcValues: true /*helps fill in the nulls above*/ 
      ); 
     } 

Dann habe ich eine RedirectToFragmentResult Klasse erstellt

public class RedirectToFragmentResult: RedirectResult 
{ 
    public UrlHelper Url {get;set;} 
    public string Action { get; set; } 
    public string Controller { get; set; } 
    public string Fragment { get; set; } 
    public object RouteValues { get; set; } 
    public RedirectToFragmentResult(UrlHelper url, string action, string controller, string fragment, object routeValues) 
     :base(url.Action(action, controller, fragment, routeValues)) 
    { 
     Url = url; 
     Action = action; 
     Controller = controller; 
     Fragment = fragment; 
     RouteValues = routeValues; 
    } 
} 

Dann können Sie einfach eine neue Routevaluedictionary (result.RouteValues) in Ihrem Gerät zu testen schaffen es die Möglichkeit zu überprüfen, würden Sie mit ein RedirectToRouteResult.

+0

Dank @Joel Dies scheint sehr gut zu funktionieren. Es gibt jedoch keine Notwendigkeit für die lokale URL-Eigenschaft (was eine Warnung "versteckt" ausgibt). Ich habe mit entfernten Zeilen getestet: 'public UrlHelper Url {get; set;} 'und' Url = url; '- ein Grund, warum das da ist? – Chris

+1

Ich benutze das zum Debuggen von Bequemlichkeit, so kann ich Zugriff auf den URL-Helper aus dem Überwachungsfenster haben, aber Sie sind richtig, dass Basis (URL.Action ist die letzte Echtzeit, die es verwendet wird und es ist nicht zum Testen erforderlich) –

Verwandte Themen