2015-03-29 2 views
0

Я пытаюсь понять, как маршрут конфигурация работает в MVC 5.Маршрутов в MVC 5

У меня есть следующая структура для моего приложения:

BaseCRUDController

public class BaseCRUDController<TEntity, TEntityViewModel> : Controller 
    where TEntity : class 
    where TEntityViewModel : class 
{ 
    private readonly IBaseService<TEntity> baseService; 

    public BaseCRUDController(IBaseService<TEntity> service) 
    { 
     this.baseService = service; 
    } 

    [HttpGet] 
    public virtual ActionResult Index() 
    { 
     IList<TEntityViewModel> entities = baseService.FindFirst(10).To<IList<TEntityViewModel>>(); 
     return View(entities); 
    } 

}

Государство-участник

[RouteArea("management")] 
[RoutePrefix("countries")] 
public class CountriesController : BaseCRUDController<Country, CountryViewModel> 
{ 
    private readonly ICountryService service; 

    public CountriesController(ICountryService service) 
     : base(service) 
    { 
     this.service = service; 
    } 
} 

То, что я пытаюсь сделать, просто: http://myapplication.com/management/countries. У меня есть много других контроллеров, что суперкласс является базовым контроллером. Я делаю так, чтобы избежать повторения кода, так как контроллеры имеют схожую структуру.

Проблемы:

  • Я не могу достичь URL, что я хочу (/ управления/страны)
  • Я не знаю, как настроить свой домашний контроллер, потому что я хочу, что оно может достигать http://myapplication.com

Как я мог исправить эти проблемы?

Мой маршрут конфигурации такова:

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

     routes.MapMvcAttributeRoutes(); 

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

Просьба точно определить, какие ошибки вы получаете (например, 404, или просмотреть не найдено и т. Д.), А также указать конфигурацию маршрута. Спасибо –

ответ

0

После немного играть вокруг мне удалось заставить его работать.

Проблема заключается в том, что при использовании маршрутизации атрибутов не назначены параметры маршрута по умолчанию.

Например, для вашего Default маршрут по умолчанию controller = "Home", action = "Index". Поэтому, если вам нужно позвонить http://myapplication.com/, механизм маршрутизации автоматически по умолчанию будет и так далее.

Однако маршрут атрибута не знает, что вы хотите по умолчанию выполнить действие Index (или любое другое действие, если на то пошло).

Для решения вопроса добавьте атрибут Route к CountriesController, как это:

[RouteArea("management")] 
[RoutePrefix("countries")] 
[Route("{action=Index}")] // this defines the default action as Index 
public class CountriesController : BaseCRUDController<Country, CountryViewModel> 
{ 
    private readonly ICountryService service; 

    public CountriesController(ICountryService service) 
     : base(service) 
    { 
     this.service = service; 
    } 
} 

Кроме того, для дальнейшего использования Phil Haack's Route Debugger является чрезвычайно полезным для выяснения вопросов маршрутизации.

+0

Знаете ли вы, почему это не работает, когда я помещаю атрибут маршрута в базовый класс? –

+0

Скорее всего потому, что атрибут не наследуется, посмотрите на это http://stackoverflow.com/questions/1240960/how-does-inheritance-work-for-attributes –

0

Вы определили область (управление) для своих контроллеров? , если вы попробуете без области, то нужно правильно перенаправить?

Смежные вопросы