2012-12-14 104 views
0

我已經創建了應用程序,其中url生成取決於數據庫值。 我解析這些網址沒有任何問題,並從我的路由處理程序中的數據庫獲取控制器和操作。asp.net mvc,通過自定義路由生成url

但是當我嘗試生成的網址,我得到麻煩。

在我的情況

,它看起來像:

視圖

@Html.ActionLink("more", MVC.Blog.Post(item.Alias)) // i use T4MVC 

MyRouteConstraint

public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
{ 
    if (routeDirection == RouteDirection.UrlGeneration) 
    { 
     var data = GetDataFromDbByControllerActionAndParameters(values); 
     if (data == null) 
      return false; 
     var valuesToRemove = new List<string>(); 
     var path = GenerateUrlByData(data, valuesToRemove); 
     values.Remove("controller"); 
     values.Remove("action"); 
     valuesToRemove.ForEach(v => values.Remove(v)); // remove values that is already used in path 
     values.Add("all", path) // path = "blog/post/postalias" 
     return true; 
    } 
    // skipped code 
} 

路由規則

routes.MapRoute("Locations", "{*all}", 
    constraints: new { all = new LocationConstraints() }, 
    defaults: new { }, 
    namespaces: new []{typeof(BaseController).Namespace}).RouteHandler = new LocationRouteHandler(); 

和作爲結果我得到的URL這樣

localhost:8553/?Controller=Blog&Action=Post&alias=postalias 

但預計這樣的

localhost:8553/blog/post/postalias 

我怎麼能生成網址是什麼?它應該在哪裏?我認爲不是在規範中,但爲什麼在這種情況下被引用?

回答

0

在我的MVC應用程序匹配你有一個低於一個最接近的路線:

routes.MapRoute(
    name: "MyRouteName", 
    url: "{SomeFolder}/{SomePageName}", 
    defaults: new { controller = "MyController", action = "Index" }, 
    constraints: new { routeConstraint = new MyRouteConstraint() } 
); 

SomeFolder可以固定或從數據庫中更改,而SomePageName將改爲從數據庫中不同的值。 url應該是您希望與此路線匹配的任何網址,以及將由數據庫中的值替換的網址。 defaults解決了在MVC循環結束時將呈現頁面的Controller和Action。 constraints將導致您描述的匹配方法。

使用此配置我有像www.project.com/SomeFolder/SomePageNameFromDatabase的URL。