0

У меня возникли проблемы с поиском ответа на этот вопрос в любом месте.Динамическая маршрутизация ASP.NET MVC3

Мне нужна форма, где пользователь может создать сообщение и изменить URL-адрес сообщения.

Например, если маршрут по умолчанию

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

Пользователь может изменить это

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

[modified-title-of-the-post] может быть что угодно, пользователь хотел бы сделать это. Это означает, что он больше не привязан к заголовку сообщения, и не только это, но и /posts/ тоже ушел.

Я думаю, я должен также упомянуть, что это должно быть глобальным, то есть пользователь должен иметь возможность изменить URL (как упоминалось выше) для других вещей, на таких сайтах, как, /topics/ или /blog/

Любая помощь будет высоко оценили,

Спасибо, Хива

ответ

2

Вы можете создать два маршрута в вашем global.asax. Что-то вроде этого

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

оба они указывают на HomeController и действия Posts

public ActionResult Posts(string url) 
{ 

} 

обрабатывать каждый URL, вы должны рассмотреть, чтобы расширить RouteBase класс

что-то подобное, что нужно сделать

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; 
} 

}

в вашем global.asax зарегистрировать пользовательский обработчик маршрута

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

Я думаю, я должен также упомянуть, что это должно быть глобальным, а это означает, что пользователь должен иметь возможность изменить URL (как упоминалось выше) другие вещи на сайтах, например,/themes/or/blog/ – hjavaher

+0

Ну, вам, вероятно, следует реализовать собственную обработку маршрутизации, возможно, на основе таблицы БД. Посмотрите на реализацию класса RouteBase. – Iridio

+0

Вау, это потрясающее решение :) спасибо! – hjavaher

Смежные вопросы