0

にHTTPのGETフォームをcanonicalizing助けが必要。正しい検索結果を返すのは3つの側面すべてからの変数に依存するため、これらの項目はすべて同じ形式でレンダリングする必要があります。私がしようとしているのは、クエリ文字列からパラメータを移動して正規のURLに入れることです。私はほとんどそこだは、私は3つの目的がありますasp.net MVCサイトでフォームを持っているのasp.net MVC

は、ここにあるこれまでのところ(エリア、コントローラ、およびアクション名のT4MVCを使用して)私の3つのルートの設定:

context.MapRoute(null, 
    "my-area/my-widgets/search/{size}-results-max/page-{page}/order-by-{sort}", 
    new 
    { 
     area = MVC.MyArea.Name, 
     controller = MVC.MyArea.MyWidgets.Name, 
     action = MVC.MyArea.MyWidgets.ActionNames.Search, 
     page = UrlParameter.Optional, 
     size = UrlParameter.Optional, 
     sort = UrlParameter.Optional, 
    } 
); 

context.MapRoute(null, 
    "my-area/my-widgets/canonicalize-search", 
    new 
    { 
     area = MVC.MyArea.Name, 
     controller = MVC.MyArea.MyWidgets.Name, 
     action = MVC.MyArea.MyWidgets.ActionNames.CanonicalizeSearch, 
    } 
); 

context.MapRoute(null, 
    "my-area/my-widgets", 
    new 
    { 
     area = MVC.MyArea.Name, 
     controller = MVC.MyArea.MyWidgets.Name, 
     action = MVC.MyArea.MyWidgets.ActionNames.CanonicalizeSearch, 
    } 
); 

ビューでフォームを使用して、CanonicalizeSearchルートに提出この構文:

[ActionName("canonicalize-search")] 
public virtual RedirectToRouteResult CanonicalizeSearch(string keyword, 
    int page = 1, int size = 10, string sort = "Title-Ascending") 
{ 
    var result = RedirectToRoutePermanent(new 
    { 
     area = MVC.MyArea.Name, 
     controller = MVC.MyArea.MyWidgets.Name, 
     action = MVC.MyArea.MyWidgets.ActionNames.Search, 
     page = page, 
     size = size, 
     sort = sort, 
     keyword = keyword, 
    }); 
    return result; 
} 

[ActionName("search")] 
public virtual ViewResult Search(string keyword, 
    int page = 1, int size = 10, string sort = "Title-Ascending") 
{ 
    // code to perform query 
    return View(model); 
} 
:MyWidgetsControllerで

@using (Html.BeginForm(MVC.MyArea.MyWidgets.CanonicalizeSearch(), 
    FormMethod.Get)) 

、2つのアクションメソッドがあります

これは、キーワードを除いて、すべてのクエリ文字変数を標準化されたルートに移動するために機能します。最初のルートにキーワードパラメータを追加すると、CanonicalizeSearchアクションは、キーワードがnull、空白または空白でない場合にのみ、検索アクションにリダイレクトされます。これは、キーワードが入力されていないときにページの結果を閲覧することが不可能になるため、うまくいきません。私は、私はすべて試したと思う

- 私が見えることができます唯一の方法は、この作業を取得しかし、他の3つのパラメータにキーワードを追加する第四ルートを追加し、キーワードにコントローラのデフォルト値を与える、などをされますキーワードをクエリ文字列パラメータとして保持する(実際には、CanonicalizeSearchのキーワードに下線を付けて、それを検索で取り除くことで動作させることができますが、それはかなりハッキリです)。

助けが必要ですか?

+0

- 私は、キーワードを追加したとき、私はこのようなURLを設定するため:「私のエリア/私の-ウィジェット/検索/ {サイズ}は-results-MAXを/ PAGE- { page}/order-by- {sort}/keyword- {keyword} "と入力します。私が「my-area/my-widgets/search/{size} -results-max/page- {page}/order-by- {sort}/{keyword}」というURLを設定すると、 keyword == null。 – danludwig

答えて

1

別の問題を解決しようとすると、より良い解決策に遭遇したと思います。

誰かがキーワードボックスの「検索条件」に入力したとします。パスにルーティングするCanonicalizeSearch法を引き起こす提出:20個のシンボルは迷惑である

/my-area/my-widgets/search/10-results-per-page/page-1/ 
    order-by-Title-Ascending/my%20search%20terms 

これら%。私はむしろ、URLは次のようになります。

/my-area/my-widgets/search/10-results-per-page/page-1/ 
    order-by-Title-Ascending/my-search-terms 

私は次のようにこれを達成することができます(一時的なリダイレクトに永久的からの変更点に注意してください):

[ActionName("canonicalize-search")] 
public virtual RedirectToRouteResult CanonicalizeSearch(string keyword, 
    int page = 1, int size = 10, string sort = "Title-Ascending") 
{ 
    var result = RedirectToRoute(new 
    { 
     area = MVC.MyArea.Name, 
     controller = MVC.MyArea.MyWidgets.Name, 
     action = MVC.MyArea.MyWidgets.ActionNames.Search, 
     page = page, 
     size = size, 
     sort = sort, 
     keyword = (string.IsNullOrWhiteSpace(keyword)) 
      ? "no-keywords" : keyword.Replace(' ', '-'), 
    }); 
    TempData["keyword"] = keyword; 
    return result; 
} 

[ActionName("search")] 
public virtual ViewResult Search(string keyword, 
    int page = 1, int size = 10, string sort = "Title-Ascending") 
{ 
    keyword = TempData["keyword"] as string ?? keyword; 
    // code to perform query 
    return View(model); 
} 

これは私が投稿質問の両方を解決しますここで%20記号を削除します。キーワードが空白または空白の場合、URLは常にレンダリングされます。

/my-area/my-widgets/search/10-results-per-page/page-1/ 
    order-by-Title-Ascending/no-keywords 

...ルートは常に一致します。それはパラメータを渡すされなかった理由が分かった

1

あなたが最初のルートでkeywordパラメータにUrlParameter.Optionalを設定してみてくださいましたか?明白で愚かなように聞こえるが、決してそれを排除したことはない。

+0

ありがとう...ええ、私が投稿を書いたときに私が除外したことはたくさんありますが、私はそれを簡潔に保つように努めていました。これで約10時間を費やしたので、「すべてを試したと思います」と言いました。キーワードにUrlParameter.Optionalを設定すると、そのようなものの1つでした。私はルートURLパスにキーワードを追加するときに、なぜ "/ keyword- {keyword}"として追加するのかという理由を知りました。私が{keyword}と書いただけでは、すべてが良かったです。私はこれをまもなく更新するつもりです。 – danludwig

関連する問題