首页 文章

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

提问于
浏览
1

我有一个页面,用户可以针对某个产品“提出问题” .

路线是:

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

哪个匹配:

/ car / questions / ask / phone / questions / ask

这是行动:

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

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

因为这个控制器在 area 中,所以"default URL"将是这样的:

/ myarea / questions / ask

所以发生了什么,当我开始行动时,“someProductUri”被设置为“myarea”,引起各种各样的悲伤 .

我想为两组URL重复使用相同的操作/视图,但我不希望路由值在默认URL时设置为“myarea” .

希望有意义 - 任何想法?

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

2 回答

  • 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;
       }    
    }
    

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

  • 2

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

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

相关问题