【问题标题】:Routes mapping in MVC 5MVC 5 中的路由映射
【发布时间】:2015-03-29 23:23:47
【问题描述】:

我正在尝试了解路由配置在 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 }
        );
    }
}

【问题讨论】:

  • 请准确定义您遇到的错误(即 404,或未找到视图等),并提供您的路线配置。谢谢

标签: asp.net asp.net-mvc routes asp.net-mvc-5


【解决方案1】:

玩了一会儿后,我设法让它工作了。

问题是当您使用属性路由时,没有分配默认路由参数。

例如,在您的 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 对找出路由问题非常有帮助。

【讨论】:

【解决方案2】:

您是否为控制器定义了区域(管理)? 如果您尝试不使用区域,是否会正确重定向?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 2012-09-03
    • 2011-04-10
    相关资源
    最近更新 更多