0

ルーティングを試して、検索用の seo フレンドリーな URL を生成しようとしています。

現在、私は以下のようなビューモデルを持っています:

public class SearchFormViewModel
    {
        //[Required(ErrorMessage="Keyword is required")]
        public string Keyword { get; set; }

        public IEnumerable<SelectListItem> TransactionTypes { get; set; }
        public int TransactionTypeId { get; set; }

        public IEnumerable<SelectListItem> RoomLookUps { get; set; }
        public int? MinBeds { get; set; }
        public int? MaxBeds { get; set; }
        ...
    }

このフォームが送信されると、コントローラーに送られます。

    public ActionResult SearchProperties(SearchFormViewModel viewModelInp)
    {
         // Perform search;
    }

と検索結果が表示されます。ただし、生成される URL は次のとおりです。

http://localhost:49191/search/searchproperties?Keyword=London&TransactionTypeId=2&MinBeds=&MaxBeds=&MinPrice=&MaxPrice=

次のような URL が必要です

http://localhost:49191/flats-to-rent/London?MinBeds=&MaxBeds=&MinPrice=&MaxPrice=

ViewModel から Route にパラメーターを渡す方法がわかりません

次のルートは機能しません。

routes.MapRouteLowercase(
                "Search-Properties-Buy",
                "flats-to-rent/{Keyword}",
                new { controller = "Search", action = "SearchProperties", Keyword = UrlParameter.Optional },
                new { TransactionTypeId = "2" }
            );

他にもいろいろ試してみましたが、どれもうまくいかず、404 エラーが発生します。

私を助けるかもしれない例を見つけることができません。

4

1 に答える 1

1

さて、私はあなたに解決策を与えようとします。asp.net mvc によって生成されたベース ルートを含む入力フィールドを配置します。

<input type="hidden" value="@Url.Action("SearchProperties", new { Keyword = "{Prototype}" })" id="BaseSearchURL" />

ご覧のとおり、「{Prototype}」値でキーワードを指定しました。これにより、asp.net mvc に構成済みのカスタム ルートを提供するよう指示されます。レンダリング後、ページ HTML に次のように表示されます。

<input type="hidden" value="server/flats-to-rent/{Prototype}" id="BaseSearchURL" />

その後、jquery を使用して送信ボタンが押されたイベントをオーバーライドし、カスタム コードを記述できます。

$(document).ready(function() {
    $('input[type=submit]').submit(function() {
        var baseURL = $('#BaseSearchURL').val();
        var keyword = $('input[name=Keyword]');
        var action = baseURL.replace('{Prototype}', keyword);
        var form = $(this).parents('form');
        // Get all parameter except Keyword
        var params = $('input[name!=Keyword], select, textarea', form).serialize();
        action += "?" + params;
        document.location = action;
    });
});

手順は簡単です:

  • 以前に生成されたルーティング テンプレート フォームを取得する
  • "{Prototype}" に置き換える必要があるキーワードを取得します。
  • フォーム パラメータを取得し、アクションに追加します
  • document.location を呼び出して、特定の URL を開始します。
于 2013-11-10T11:39:17.537 に答える