0

我创建了应用程序,其中 url 生成取决于数据库值。我解析这些 url 没有任何问题,并在我的路由处理程序中从数据库中获取控制器和操作。

但是当我尝试生成 url 时,我遇到了麻烦。

就我而言,它似乎是:

看法

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

我的路由约束

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

我怎样才能生成网址?它应该在哪里?我认为不是常数,但为什么在这种情况下会调用它?

4

1 回答 1

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将导致您描述的 Match 方法。

使用此配置,我有类似www.project.com/SomeFolder/SomePageNameFromDatabase.

于 2012-12-14T08:27:43.813 回答