2016-06-07 4 views
1

Я только что начал новый проект MVC, и маршрут по умолчанию, похоже, не работает, как я ожидаю.MVC Default Route not Working for Controller

Routing Configuration:

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 собирается к действию "Index" на "Сценарии" контроллера с @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

У вас есть физический «Скрипты» в вашем корне приложения. Сообщение об ошибке, которое вы видите, является ожидаемым поведением. Когда приходит запрос GET для /Scripts, 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

В корне проекта есть каталог «Скрипты», который был частью шаблона MVC по умолчанию для хранения файлов javascript. Это приложение будет заниматься управлением SQL-скриптами, поэтому произошло совпадение имен совпадений. Изменение имени контроллера на 'ScriptController' действительно устранило проблему. Спасибо. –