【问题标题】:ASP.NET MVC 3 - Edge case with Routing in AreaASP.NET MVC 3 - 区域路由的边缘案例
【发布时间】:2011-07-21 01:50:34
【问题描述】:

我有一个页面,用户可以在其中针对产品“提问”。

路线是:

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 重复使用相同的操作/视图,但是当它是默认 URL 时,我不希望将路由值设置为“myarea”。

希望这是有道理的 - 有什么想法吗?

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

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing asp.net-mvc-areas


    【解决方案1】:

    我已经有太多路线了,所以我不想只为这种边缘情况添加另一条路线。

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

    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" }
              );
      

      【讨论】:

      • 是的,我可以这样做,但我希望这可以通过默认区域路由来处理。
      • 你可以添加一个约束来阻止你的路由匹配myarea
      • 正是我现在正在尝试的... :) 一个“notEqualtoareaNameconstraint”。 :)
      猜你喜欢
      • 2011-07-03
      • 1970-01-01
      • 2011-11-15
      • 2010-12-09
      • 2018-05-31
      • 1970-01-01
      • 2021-02-13
      • 2011-03-17
      • 1970-01-01
      相关资源
      最近更新 更多