0

我有一个语法如下的控制器:

public class CrudController<TEntity> : Controller

现在如果我需要一个CrudControllerfor Entity User,我只需要CrudController像这样扩展

UserCrudController : CrudController<User>

它工作得很好。但是,问题是,UserCrudController它只是空的。此外,还有一些其他CrudControllers的也是空的。

现在,我正在寻找一种方法来避免编写空的 crud 控制器。我只是想CrudController用适当的通用参数创建实例。也许通过如下所述的严格命名约定。

  • URL 将类似于:@Html.ActionLink("Create", "UserCrud")
  • 当接收到 URL 时,它会尝试定位名为的控制器UserCrud(默认的东西)
  • 如果找不到UserCrudCrud<User>将被创建。

现在,我可以做我想做的事情了。但究竟我在哪里做这些?mvc中解析的url在哪里?

4

1 回答 1

1

在 Craig Stuntz 对这个问题的评论和这个问题及其接受的答案的帮助下,我解决了我的问题。

我已经实现了一个自定义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 回答