0

私は次のような構文のコントローラーを持っています:

public class CrudController<TEntity> : Controller

CrudControllerfor Entityが必要な場合は、次のようUserに拡張する必要がありますCrudController

UserCrudController : CrudController<User>

それはうまく機能しています。しかし、問題は、それUserCrudControllerは単に空であるということです。また、他CrudControllersにも空の物があります。

今、私は空のクラッドコントローラーを書かないようにする方法を探しています。CrudController適切な一般的な引数を使用してのインスタンスを作成したいだけです。おそらく、以下で説明するような厳密な命名規則によるものです。

  • URLは次のようになります。@Html.ActionLink("Create", "UserCrud")
  • UserCrudURLを受信すると、 (デフォルトのもの)という名前のコントローラーを見つけようとします。
  • 見つからない場合はUserCrudCrud<User>が作成されます。

今、やりたいことができるようになりました。しかし、正確にはどこでこれらを行うのですか?URLはMVCのどこで解析されますか?

4

1 に答える 1

1

質問とこの質問に対するCraigStuntzのコメントとその受け入れられた答えの助けを借りて、私は私の問題を解決しました。

カスタムを実装しましたCotrollerFactory

public class CrudControllerFactory : DefaultControllerFactory {
    protected override Type GetControllerType(System.Web.Routing.RequestContext requestContext, string controllerName) {
        Type controllerType = base.GetControllerType(requestContext, controllerName);

        if(controllerType == null) {
            int indexOfEntityEnd = controllerName.LastIndexOf("Crud");
            if(indexOfEntityEnd >= 0) {
                string entityName = controllerName.Substring(0, controllerName.Length - indexOfEntityEnd - 1);
                // Get type of the CrudController and set to controller tye
            }
        }

        return controllerType;
    }
}

そして、でApplication_Start()、私はこの行を追加しました:

ControllerBuilder.Current.SetControllerFactory(typeof(CrudControllerFactory));

于 2012-06-21T04:56:49.217 に答える