2016-08-16 6 views
0

私はこれらのページのいくつかのページとパブリックハンドル(別名、エイリアス)を開発しなければなりません。コントローラアクションメソッドから新しいルートを登録するには?

(このアイデアを得るには、Facebookのエイリアスを持っていて、最後のURLはfacebook/somelongpieceofsomestuffではなくfacebook/aliasのようになります)。

パブリックハンドルをdbテーブルに格納し、すべてのハンドルが一意であることを確認します。 は、今私は私のハンドルのルーティング登録を追加しました:

だから、
public override void RegisterArea(AreaRegistrationContext context) 
{ 
    // Assume, that I already have dictionary of handles and ids for them 
    foreach(var pair in publicHandlesDictionary) 
    { 
     var encId = SomeHelper.Encrypt(pair.Key); 
     context.MapRoute(pair.Value, pair.Value, 
      new {controller = "MyController", action="Index", id = encId}); 
    } 
} 

、今私は、アドレスhttp://example.com/alias1代わりのhttp://example.com/MyController/Index&id=someLongEncryptedIdを使用して、いくつかのページに到達することができます。 これはうまく動作します。

しかし、私がアプリを起動したら、新しいハンドルを追加するとどうなりますか?この新しいハンドルは登録されません。アプリの起動時にすべてのルート登録が実行されるからです。基本的には、新しいハンドルを含めてすべてのルートを再度登録するには、アプリケーション(IIS、VS/IIS Express、Azureは関係ありません)を再起動する必要があります。

コントローラのアクションメソッド(新しいハンドルが追加されたとき)から新しいルート登録を追加する方法はありますか?

答えて

1

あなたはapp startですべてのルートを作成する必要はありません。

ちょうどそれが私の作品のように、あなたがpublicHandlesDictionaryいつでも更新することができますし、routeが変化

+0

をピックアップするこの方法はそうエイリアスロジック

public class AliasConstraint : IRouteConstraint { public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { var alias = values[parameterName]; // Assume, that I already have dictionary of handles and ids for them var publicHandlesDictionary = SomeStaticClass.Dic; if (publicHandlesDictionary.ContainsValue(alias)) { //adding encId as route parameter values["id"] = SomeHelper.Encrypt(publicHandlesDictionary.FirstOrDefault(x => x.Value == alias).Key); return true; } return false; } } //for all alias routes routes.MapRoute( name: "Alias", url: "{*alias}", defaults: new {controller = "MyController", action = "Index"}, constraints: new { alias = new AliasConstraint() } ); //for all other default operations routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); 

に従うべきかを決定するためにIRouteConstraintを使用しています。どうもありがとうございました!))) –

関連する問題