3

次の形式でURLのカスタムルートを作成しようとしています。

http:// domain / nodes / {item_1} / {item_2} / {item3_} /..../ {item_ [n]}

基本的に、たとえば、ランダムな量のitem_[n]が存在する可能性があります。

http://domain/nodes/1/3/2 

http://domain/nodes/1

http://domain/nodes/1/25/11/45

カスタムルートを使用して、アイテムの配列を取得し、それらを使用していくつかのロジック(検証し、コンテキストを要求するための特定の情報を追加)を実行したいと思います。

たとえば、[http:// domain / nodes / 1/25/11/45]から、[1、25、11、45]の配列を取得して処理したいと思います。

だから、私はここで2つの問題があります。

最初のものは実際の質問です。私は正しい方向を見ていますか?または、これを達成するためのより簡単な方法がありますか(おそらくカスタムルートなしで)?

2番目の問題は、着信URLを正規表現パターンと一致させることです。誰かがそれを手伝ってくれませんか?

前もって感謝します :)

4

2 に答える 2

1

あなたの問題を解決するために、ルーティングクラスを作成してからparamsaccordinlgyを処理する方法があると思います。

  public class CustomRouting : RouteBase
  {
     public override RouteData GetRouteData(HttpContextBase httpContext)
     {
       RouteData result = null;
       var repository = new FakeRouteDB(); //Use you preferred DI injector
       string requestUrl = httpContext.Request.AppRelativeCurrentExecutionFilePath;
       string[] sections = requestUrl.Split('/');
       /*
       from here you work on the array you just created
       you can check every single part
       */
       if (sections.Count() == 2 && sections[1] == "")
         return null; // ~/

       if (sections.Count() > 2) //2 is just an example
       {
         result = new RouteData(this, new MvcRouteHandler());
         result.Values.Add("controller", "Products");
         result.Values.Add("action", "Edit");
         result.Values.Add("itmes0", sections[1]);
         if (sections.Count() >= 3)
         result.Values.Add("item2", sections[2]);
         //....
       }
       else
       {
         //I can prepare a default route        
         result = new RouteData(this, new MvcRouteHandler());
         result.Values.Add("controller", "Home");
         result.Values.Add("action", "Index");
       }
       return result;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
     //I just work with outbound so it's ok here to do nothing
     return null;
    }
}

global.asaxで

public static void RegisterRoutes(RouteCollection routes)
{
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

  routes.Add(new CustomRouting());

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

これはあなたに私がどう思うかについての考えを与えるはずです。それが役に立てば幸い

于 2012-04-24T14:48:58.537 に答える
0

質問の最初の部分についてはお手伝いできませんが、正規表現の作成に取り掛かることはできます。

あなたの例では、すべての項目は数字です-それが唯一のオプションですか?そうでない場合は、可能な文字に関する詳細情報を提供してください。

今のところ、正規表現は次のようになります。

@"http://domain/nodes(?:/(\d+))*"

(?:)非キャプチャグループで()あり、キャプチャグループです。
すべてのオカレンスに一致すると、1-nグループになります。各グループには、一致した番号が含まれます(グループ番号0が完全に一致します)。

于 2012-04-24T12:36:57.643 に答える