0

asp.net mvc でデフォルト ルーティングを使用し、ActionLink を使用した結果

@Html.ActionLink("title", "Index", "Question", new { id = 25}, null)

は :

http://localhost/question/index/25

へのリンクを変更するため

http://localhost/question/25

デフォルトの前に、Global.asax に新しいルーティング ロールを追加しました。

routes.MapRoute(
            "default2", // Route name 
            "Question/{id}", // URL with parameters
            new { controller = "Questions", action = "Index", id = UrlParameter.Optional} // Parameter defaults
        );

ユーザー、タグなどに同じ問題があります。各テーマに同じロールを作成する必要がありますか?

4

2 に答える 2

2

これを試しましたか?

  routes.MapRoute(
      "", 
      "{controller}/{id}",
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
  );

アップデート:

idが常に整数になる場合は、上記のルートに単純な数値制約を配置して、@Nick によって報告されたルーティングの問題を回避できます。

  routes.MapRoute(
      "my-route",
      "{controller}/{id}",
      new { controller = "Home", action = "Index", id = UrlParameter.Optional },
      new { id = @"\d*" }
  );
于 2012-05-21T13:27:40.710 に答える
1

これをさらに一歩進めて、3 つの別々のルートを登録する必要がないように、ルート制約を作成する方法を示したいと思いました。

次の記事をガイドとして使用すると、指定するコントローラーのリストに対して現在のルート コントローラーを検証する制約を作成できます。

http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-custom-route-constraint-cs

だからここにルート制約のある私のクラスがあります:

public class ControllerConstraint : IRouteConstraint
{
    private string[] _controllers;

    public ControllerConstraint() : this(null) { }
    public ControllerConstraint(string[] controllers)
    {
        _controllers = controllers;
    }

    #region IRouteConstraint Members
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        string  currentController = values.ContainsKey("controller")?  values["controller"].ToString() : null;

        return _controllers != null //The list of controllers passed to the route constraint has at least one value in it
            && !String.IsNullOrEmpty(currentController) //The current route data has a controller in it to compare against
            && (from c in _controllers where c.Equals(currentController,StringComparison.CurrentCultureIgnoreCase) select c).ToList().Count > 0; //We find a match of the route controller against the list of controllers
    }
    #endregion
}

そこから、Globa.asax にルートを登録する方法を変更するだけです。

 routes.MapRoute(
      "Action-less Route", // Route name
      "{controller}/{id}", // URL with parameters
      new { controller = "Questions", action = "Index", id = UrlParameter.Optional}, //Parameter defaults
      new {isController = new ControllerConstraint(new string[] {"Questions","Users","Tags"})} //Route Constraint
        ); 

さらに一歩進んで、{id} が次のような追加のルート制約を持つ数値であることを検証することもできます。

http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs

于 2012-05-21T13:59:49.717 に答える