我试图了解路由配置在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);
}
}
CountriesController
[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。 我有许多其他控制器,超类是基本控制器。我这样做是为了避免代码重复,因为控制器具有相似的结构。
问题是:
我该如何解决这些问题?
我的路线配置是这样的:
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 :(得分:0)
经过一番游戏,我设法让它发挥作用。
问题是当您使用属性路由时,没有分配默认路由参数。
例如,在Default
路由中,默认值为controller = "Home", action = "Index"
。因此,如果您拨打http://myapplication.com/,路由引擎将自动默认为/Home/Index/
,依此类推。
但是,属性路由无法知道您要默认为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对于解决路由问题非常有帮助。
答案 1 :(得分:0)
您是否为控制器定义了区域(管理)? 如果你尝试没有区域,是否正确地重定向?