2012-01-20 19 views
3

私はasp.mvcプロジェクトを持っています。私は学校の「名前」「45」を取るために、たとえば、より「ユーザーフレンドリー」名にこの「45」(学校のID)を変更したいURLルートパラメータを別の値で変更することは可能ですか

site/school/45 
site/school/45/courses 
site/school/45/teachers 
site/school/45/courses/17 
etc. 

:現在のURLを以下の形式に設定しているルーティング。 今すぐアクションメソッドは次のようです:

public ActionResult Index(int schoolId) 
{ ... 

ではなく、アクション・メソッドを変更することなく、schoolID学校名を表示するには、ルーティングを変更することは可能ですか?

答えて

4

は右、あなたの質問の最も重要な部分であると思われますか?

はい、できます。コントローラークラスのOnActionEcecuting(ActionExecutingContext filterContext)メソッドをオーバーライドして、名前-idマッピングを行うことができます。あなたは、次の操作を行う必要があります

  1. 、このような何かをベースコントローラクラスを実装します。

    public class BaseController: Controller 
    { 
         protected override void OnActionExecuting(ActionExecutingContext filterContext) 
         { 
          base.OnActionExecuting(filterContext); 
          var shoolName = filterContext.RouteData.Values["schoolName"].ToString(); 
          var schoolId = ...; // Get school id from name somehow here 
          filterContext.RouteData.Values.Add("schoolId", schoolId); 
         } 
    } 
    

    (私はあなたがグローバルにschoolIdからschoolNameにご対応するルーティングパラメータ名を変更することを、ここで想定しています。 asax.cs/RegisterRoutes)。

  2. 更新彼らはありません。このような、Controllerからではなく、BaseControllerから継承させることで、すべてのコントローラ:それはすべての後

    public class SomethingController: BaseController 
    { 
        ... 
    } 
    

が動作する必要があります。コントローラーのアクションを変更する必要はありません。schoolIdパラメーターは、呼び出すときに既に配置されています。

0

カスタムモデルのバインダーでこれを達成し、名前に基づいて学校のIDを把握し、これを使用してschoolIdパラメータにバインドします。

ただし、学校の名前が変更された場合などは、すべてのブックマークが機能しなくなるか、URLが正しく表示されない場合があります。

2

グローバルルーティングに新しいルートを追加して、int idではなく文字列名を使用する必要があります。 学校名をとり、データベース(キャッシュされたオブジェクト/辞書)から名前をIDに変換してからintインデックスメソッドに転送する新しいメソッドを作成することをお勧めします。 「アクションメソッドを変更せずに」

(キャッシング示されていない)、このような何か

public ActionResult Index(string schoolName) 
{ 
var schoolId = SomeMethodThatGetsTheIdFromString(schoolName) 
RedirectToAction("Index", new { id = schoolId }); 
} 
関連する問題