2012-04-14 21 views
0

Ich habe Probleme, die Antwort auf diese Frage überall zu finden.ASP.NET MVC3 dynamisches Routing

Ich brauche ein Formular erstellen, wo der Benutzer einen Beitrag erstellen und die URL auf den Beitrag ändern kann.

Zum Beispiel, wenn die Standardroute ist

http://www.domain.com/posts/[the-title-of-the-post] 

Die Nutzer dies ändern können

http://www.domain.com/[modified-title-of-the-post]. 

Die [modified-title-of-the-post] kann alles sein, der Benutzer sie machen möchte. Dies bedeutet, es ist nicht mehr an den Titel des Beitrags gebunden und nicht nur das, aber die /posts/ ist auch weg.

Ich denke, ich sollte auch erwähnen, dass diese global sein sollte, dh der Benutzer in der Lage sein sollte, die URL zu ändern (wie oben erwähnt) für andere Dinge auf den Seiten wie, /topics/ oder /blog/

Jede Hilfe wäre sehr geschätzt,

Danke, Hiva

Antwort

2

Sie könnten zwei Routen in Ihrer global.asax erstellen. So etwas wie dieses

routes.MapRoute("", "posts/{url}", new { controller = "Home", action = "Posts" }); 
routes.MapRoute("", "{url}", new { controller = "Home", action = "Posts" }); 

beide verweisen auf HomeController und die Wirkung Posts

public ActionResult Posts(string url) 
{ 

} 

jede URL behandeln Sie berücksichtigen sollten, die RouteBase Klasse

etwas zu verlängern wie das

tun sollten
public class CustomRouting : RouteBase 
{ 
    public override RouteData GetRouteData(HttpContextBase httpContext) 
    { 
    RouteData result = null; 
    string requestUrl = httpContext.Request.AppRelativeCurrentExecutionFilePath; 

    //Handle the request 
    //Compile the RouteData with your data 
    result = new RouteData(this, new MvcRouteHandler()); 
    result.Values.Add("controller", "MyController"); 
    result.Values.Add("action", "MyAction"); 
    result.Values.Add("id", MyId); 
    } 
    } 
    return result; 
} 

public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
{ 
    //I only need to handle outbound so here is ok 
    return null; 
} 

}

Die in Ihrer global.asax Sie Ihre individuelle Route Handler

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.Add(new CustomRouting()); 

    routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 
} 
+0

registrieren ich denke, ich auch erwähnen sollte, dass diese globale sein sollte, sollte der Benutzer Sinn der Lage sein, die URL zu ändern (wie oben erwähnt) für andere Dinge auf den Sites wie,/topics/oder/blog/ – hjavaher

+0

Nun, Sie sollten wahrscheinlich Ihre eigene Handhabung von Routing implementieren, vielleicht basierend auf einer Tabelle einer DB. Suchen Sie nach der RouteBase-Klasse zu implementieren. – Iridio

+0

wow, das ist eine tolle lösung :) danke !! – hjavaher