2016-11-19 90 views
0

我已经创建了我的第一个WebAPI项目来学习,该项目在项目的根目录中有一个index.html页面。我将该页面设置为启动。所有工作正常。但是,我想使用MVC控制器来调用视图。在WebAPI项目中创建MVC控制器默认值

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

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

我创建了一个View文件夹,并关闭了默认文件夹,其中创建了一个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 Error 403.14 - Forbidden The Web server is configured to not list the contents of this directory.

回答

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 } 
); 
} 
+0

我已经注意到了,因为我创造了我的项目,作为项目的WebAPI的的RegisterRoutes永远不会被调用。相反,正在使用“WebApiConfig”类。 – Craig

+0

在启动时调用注册路由 – Nkosi

+0

好吧,为了确认,我有一个WebApi项目(没有MVC的东西)。我添加一个MVC控制器(然后添加默认路由等,以及所有的MVC辅助参考)。然后在调用WebApiConfig.Register之后,在Application_Start中添加一个对RegisterRoutes的调用?然后,我如何将我的Home.Index方法作为我的启动进行发送? – Craig

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控制器

0

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

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

应该是“家”的控制器,并且行动是“指数”。但是,这个maproute是默认的。如果你想添加另一个呢?

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

您可以像上面显示的那样自由撰写,其中“Articles”是maproute的名称,“articles”是url。如果您编译控制器News and Action ArticleList,它会变成这样(http://www.domain.com/articles)。和“..../articles”是你替换的东西(不需要定义控制器或者动作),你不需要打开www.domain.com/News/ArticleList它足够去网址www.domain.com/文章和maproute将自动转到控制器新闻和动作文章列表。

这只是我关于maproute如何工作的观点。

CMIIW :)