如何使用类库中的Controller?

时间:2014-02-11 14:54:45

标签: c# asp.net-mvc asp.net-web-api asp.net-mvc-5

我在类库中有控制器,但我无法弄清楚如何让主项目识别它们。主项目引用了我的类库。我需要在某处注册吗?

我想同时使用控制器和ApiControllers。

修改

路线配置 - 与创建项目无关:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Page", action = "Dashboard", id = UrlParameter.Optional }
        );
    }
}

WebApi配置,再次保持不变:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

控制器我正试图先行动:

public class UIController : Controller
{
    [ChildActionOnly]
    public PartialViewResult StartMenu()
    {
        StartMenu menu = StartMenuFactory.Get();

        return PartialView(menu);
    }

    [ChildActionOnly]
    public PartialViewResult Explorer()
    {
        return PartialView();
    }

    //
    // GET: /Page/
    public ActionResult Test()
    {
        return View();
    }
}

我在主项目中的Views内的UI文件夹中创建了一个Test.cshtml。 Explorer.cshtml和StartMenu.cshtml位于共享内部视图中。

2 个答案:

答案 0 :(得分:5)

您的控制器类名是否以" Controller"结尾,这是强制性的。

你正在做什么应该工作,控制器工厂这样做:

  

...默认工厂使用类型缓存   内部。类型缓存在。中实现   ControllerTypeCache类。在应用程序初始化期间,   ControllerTypeCache类使用.NET反射来枚举所有   引用程序集并探索它们寻找公开曝光   控制器类型。控制器类型是传递的任何引用类型   以下测试:

static bool IsControllerType(Type t)
{
     return
        t != null &&
        t.IsPublic &&
        t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase) &&
        !t.IsAbstract &&
        typeof(IController).IsAssignableFrom(t);
}

来自:https://www.simple-talk.com/dotnet/asp.net/asp.net-mvc-controllers-and-conventions/

这意味着使用控制器对程序集的简单引用就足够了。

如果您的控制器满足这些规则,您应该没问题。

答案 1 :(得分:0)

由于许多因素,API控制器的解决方案将与常规MVC的解决方案不同。有关如何处理Web API控制器的信息,请参阅以下内容:using external web api controllers