0

私はアプリケーションを作成しました。URLが生成する場所はデータベースの値によって異なります。これらのURLを問題なく解析し、ルートハンドラーのデータベースからコントローラーとアクションを取得します。

しかし、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

どうすればURLを生成できますか?どこにあるべきですか?私はconstrantではないと思いますが、なぜこの場合に呼び出されるのですか?

4

1 に答える 1

0

私のMVCアプリケーションでは、お持ちのルートに一致する最も近いルートは次のルートです。

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

SomeFolderSomePageNameデータベースから別の値に変更されている間、データベースから修正または変更することができます。はurl、このルートと照合するURLと、データベースの値に置き換えられるURLである必要があります。defaultsMVCサイクルの最後にページをレンダリングするコントローラーとアクションのアドレス。説明されているconstraintsMatchメソッドにつながります。

この構成では、のようなURLがありますwww.project.com/SomeFolder/SomePageNameFromDatabase

于 2012-12-14T08:27:43.813 に答える