在MVC 5中的路由映射

时间:2015-03-29 23:23:47

标签: asp.net asp.net-mvc routes asp.net-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);
    }

}

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。 我有许多其他控制器,超类是基本控制器。我这样做是为了避免代码重复,因为控制器具有相似的结构。

问题是:

  • 我无法访问我想要的网址(/ management / countries)
  • 我不知道如何配置我的家庭控制器,因为我希望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 }
        );
    }
}

2 个答案:

答案 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)

您是否为控制器定义了区域(管理)? 如果你尝试没有区域,是否正确地重定向?