MVC属性路由添加区域查询字符串参数

时间:2015-06-18 20:25:46

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

我尝试通过各种方法将Route属性添加到控制器中。

[Route("Trials/{trialId:int}/Components/{action}")]
public partial class ComponentsController : Controller
{
    public virtual ActionResult List(int trialId)
    {
        return View();
    }
}

或者

[RoutePrefix("Trials/{trialId:int}/Components")]
[Route("{action=List}")]
public partial class ComponentsController : Controller
{
    public virtual ActionResult List(int trialId)
    {
        return View();
    }
}

只是几个例子。

生成此控制器/操作的链接如下所示:

http://localhost:50077/Trials/3/Components?Area=

我希望删除查询字符串参数。无论我如何使用属性放置路由配置,它似乎都无法工作。

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

        routes.MapMvcAttributeRoutes();

        //routes.MapRoute(
        //    name: "TrialComponents",
        //    url: "Trials/{trialId}/Components/{action}/{id}",
        //    defaults: new {controller = "Components", action = "List", area = "", id = UrlParameter.Optional},
        //    constraints: new { trialId = "\\d+"}
        //);

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "UnitGroups", action = "List", area = "", id = UrlParameter.Optional }
        );
    }
}

注释掉的路线有效且不会对网址应用查询字符串。

任何人都可以解释为什么路由方法是添加区域查询字符串以及如何修复它?我很难过。

1 个答案:

答案 0 :(得分:0)

区域不是存储在RouteData.Values集合中的路由值,而是在RouteData.DataTokens集合中找到(作为元数据)。在area中为RouteCollection设置默认值是不正确的,因为这只会应用于请求的RouteData.Values

简而言之,要从生成的网址中删除Area参数,您需要将其作为MapRoute中的默认值删除。

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "UnitGroups", action = "List", id = UrlParameter.Optional }
);