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",这样它就不匹配路由并回落到默认值?
我已经有太多的路由了,所以我不想再为这个边缘情况添加一个。
所以我最终使用了路由约束:
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" }
);