2017-05-09 16 views
3

urlに一致するrouteを制約付きで設定したいとします。 controllアクションLoadContentに完全なURLを渡すことを期待するとき、私は制約が満たされた場合ASP.NETルーティング - 制約付きでURL全体を取得する

public class ContentURLConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     var s = (string)values["url"]; 
     return s.Contains("comm");    
    } 
} 

:私は次の簡単な制約が

routes.MapRouteLowercase("CatchAll Content Validation", "{*url}", 
    new { controller = "Content", action = "LoadContent" }, 
    new { url = new ContentURLConstraint(), } 
); 

およびテスト目的のために:これは私が試したものです

public ActionResult LoadContent(string url) 
{ 
    return Content(url); 
} 

私は期待しています、私はにsページをロードするとき10は、urlの全部を含むように機能するので、確認することができますが、代わりにnullです。私は何が欠けていますか?

+1

達成しようとしていることを完全には明確にしていません。おそらくあなたの質問をいくつかの例で更新できますか? –

+0

私はもう少し詳細を追加しました。要するに、すべての着信URLを制約に照らしてチェックし、満たしていればアクションに沿って完全なURLを渡したいと思います。表示されている一致機能は、私が抱えている問題を説明するためのものです。 – jackmott

+0

メソッド内で 'values'オブジェクトの外観を見せてください。 – krillgar

答えて

2

ルートにurlが存在しない場合は、nullとなります。つまり、ホスト自体:http://localhost:64222です。

URLがある場合(例:http://localhost:64222/one/two)、urlのパラメータの値はone/twoになります。

あなたのような何かにあなたの制約を変更することができます。

public class ContentURLConstraint : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values routeDirection) 
    { 
     var url = values[parameterName] as string; 
     if (!string.IsNullOrEmpty(url)) 
     { 
      return url.Contains("comm"); 
     } 

     return false; // or true, depending on what you need. 
    } 
} 

私は何をしないのかもしれませんか?

URL制約にホスト、ポート、スキーマ、およびクエリ文字列が含まれていない可能性があります。必要な場合は、httpContext.Requestから入手できます。

+1

それは理にかなっています!ありがとうございました。 – jackmott

関連する問題