2016-06-07 65 views
1

我刚刚开始了一个新的MVC项目,默认路由似乎没有像我期望的那样工作。MVC默认路由不能用于控制器

路由配置:

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

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

我有一个ActionLink去“索引”动作“脚本”控制器,带有@Html.ActionLink("Scripts", "Index", "Scripts")

public class ScriptsController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new IndexModel(); 
     ....... 
     return View(model); 
    } 
} 

当点击该链接时,浏览器尝试导航到“http://localhost:1733/Scripts/”,浏览器显示“目录列表拒绝”错误。当我手动将URL更改为“http://localhost:1733/Scripts/Index”时,它工作正常。

不应该默认路由自动推断“索引”行动? 它似乎是工作的ManageController类,这是默认的MVC网站模板的一部分(“http://localhost:1733/Manage”带来了Index的ActionResult的ManageController

我在做什么错?

回答

6

我想你的应用程序根目录中有物理“脚本”。您看到的错误消息是预期的行为。当/Scripts的GET请求到来时,IIS不知道是返回(脚本的)目录内容还是让mvc返回ScriptsController结果。这很混乱。

您应该尽量不要将您的控制器命名为与物理目录名相同的名称。更改任一名称。

如果您不想重命名其中的任何一个,则可以将RouteExistingFiles属性设置为true,以告知框架路由是否应处理与现有物理文件/目录匹配的URL。

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

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

     routes.RouteExistingFiles = true; 
    } 
} 

你需要确保你没有在ScriptsController相匹配的物理文件/静态资源的任何动作方法(例如:捆绑/最小化脚本资源名称)。

+1

项目根目录中有一个“Scripts”目录,它是用于存放JavaScript文件的默认MVC模板的一部分。这个应用程序将处理管理SQL脚本,所以只有一个巧合的名称冲突。将控制器名称更改为'ScriptController'确实解决了这个问题。谢谢。 –

相关问题