asp.net mvc,通过自定义路由生成url

时间:2012-12-14 02:40:24

标签: asp.net-mvc-4 routes

我创建了应用程序,其中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();

因此我得到了像这样的网址

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

但是期待这样

localhost:8553/blog/post/postalias

我该如何生成网址?它应该在哪里?我认为不是在constrant中,而是为什么在这种情况下调用它?

1 个答案:

答案 0 :(得分:0)

在我的MVC应用程序中,与您拥有的最接近的路线是下面的路线:

routes.MapRoute(
    name: "MyRouteName",
    url: "{SomeFolder}/{SomePageName}",
    defaults: new { controller = "MyController", action = "Index" },
    constraints: new { routeConstraint = new MyRouteConstraint() }
);
可以从数据库修复或更改

SomeFolder,而SomePageName将更改为与数据库不同的值。 url应该是您想要与此路由匹配的任何URL以及将被数据库中的值替换的URL。 defaults解决了将在MVC循环结束时呈现页面的Controller和Action。 constraints将导致您描述的匹配方法。

使用此配置,我有www.project.com/SomeFolder/SomePageNameFromDatabase等网址。