使MVC控制器成为WebAPI项目中的默认控制器

时间:2016-11-19 05:54:57

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

我创建了我要学习的第一个WebAPI项目,该项目在项目的根目录中有一个index.html页面。我将该页面设置为Startup。一切正常。但是,我想使用MVC控制器来调用View。

所以我在Controller文件夹中创建了一个名为" DefaultController"的新MVC控制器。在其中,有一种方法:

 public ActionResult Index()
        {
            return View();
        }

我创建了一个View文件夹,然后创建了一个Default文件夹,在其中创建了一个Index.cshtml文件。

当我启动项目时,它调用我的旧index.html。所以,我把启动改为index.cshtml,这是错误的 - 知道。 MVC调用控制器方法。所以,我试图解决 - 我如何在DefaultController中调用控制器方法?

我想我需要改变路线?

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

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

        }

我的计划是使用cshtml页面(而不是html页面)来使用布局并允许控制器启动视图。每个视图都会使用api回调给我的WebApi控制器来进行数据处理。

这似乎是处理我的WebAPI / KnockoutJs项目的好方法吗?

我只需要知道如何让控制器成为默认控制器。

删除index.html页面时,出现错误:

  

HTTP错误403.14 - 禁止将Web服务器配置为不列出   这个目录的内容。

3 个答案:

答案 0 :(得分:0)

我认为您需要将控制器名称添加到默认对象中,如下所示:

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

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

答案 1 :(得分:0)

您需要注册WebAPI路由和MVC路由: 所有这些都应该在Application_Start文件中的Global.asax.cs方法中完成:

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

GlobalConfiguration.Configure(WebApiConfig.Register)用于配置WebApi(并注册与api相关的路由)():

public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            // Configure Web API to use only bearer token authentication.
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // Web API routes
            config.MapHttpAttributeRoutes();

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

RouteConfig.RegisterRoutes(RouteTable.Routes);用于注册MVC路由:

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

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

您还需要验证您创建的DefaultController是MVC控制器(继承自System.Web.Mvc.Controller)而不是WebAPI控制器

答案 2 :(得分:0)

根据我的经验,当你想调用index.cshtml时,在路由配置中你必须在RouteConfig.cs中定义这样的控制器:

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

控制器应该是" Home",而Action是" Index"。但是,这个maproute是默认的。如果你想再增加一个怎么样?

   routes.MapRoute(
      "Article",
      "articles",
      new { controller = "News", action = "ArticleList" }
   );

您可以像上面显示的那样随意写作"文章"是maproute的名称和"文章"是网址。如果编译控制器新闻和动作文章列表,它将变成这样(http://www.domain.com/articles)。并且" .... / articles"是你替换的东西(不需要定义控制器或动作)你不需要打开www.domain.com/News/ArticleList它足以访问网址www.domain.com/articles和maproute将自动路由到控制器新闻和行动文章列表。

这只是我对maproute如何运作的观点。

CMIIW:)