ASP.. NET MVC 3 -在区域中路由的边缘情况

本文关键字:路由 边缘 情况 区域 NET MVC ASP | 更新日期: 2023-09-27 18:03:12

我有一个用户可以"问问题"的页面。

路由为:

context.MapRoute(
                "Q&A - Ask - by Product",
                "{someProductUri}/questions/ask",
                new { controller = "Questions", action = "Ask" }
            );

匹配:

/汽车/问题/问

/电话/问题/问

动作如下:

public class QuestionsController : Controller
{
    public ViewResult Ask(string someProductUri)
    {
      // ...
    }
}

现在,问题是,我还需要允许用户在页面本身选择产品,例如在URI中没有预先选择产品。

由于该控制器位于区域,因此此"默认url"将像这样:

/myarea/问题/问

结果是,当我到达动作时,"someProductUri"被设置为"myarea",引起各种悲伤。

我想对两组URL重新使用相同的操作/视图,但我不希望路由值被设置为"myarea"

希望这是有意义的-有什么想法吗?

我需要一条单独的路线吗?我是否可以添加一个路由约束,以便someProductUri"不能是myarea",这样它就不匹配路由并回落到默认值?

ASP.. NET MVC 3 -在区域中路由的边缘情况

我已经有太多的路由了,所以我不想再为这个边缘情况添加一个。

所以我最终使用了路由约束:

public class NotEqualToAreaName : IRouteConstraint
{
   public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
   {
      return String.Compare(values[parameterName].ToString(), route.DataTokens["area"].ToString(), true) != 0;
   }    
}

非常简单,通用-所以我可以在任何时候重复使用它,我遇到这种类型的边缘情况

您需要为该区域添加单独的路由:

context.MapRoute(
            "Q&A - Ask - by Product",
            "myarea/questions/ask",
            new { controller = "Questions", action = "Ask" }
        );