2016-05-28 17 views
1

私のアプリケーションのビューの1つに検索フィルタを実装しています。私は@Html.BeginForm()とGETリクエストを使ってrouteValuesをコントローラアクションに渡すことに苦労しています。MVC BeginForm - GETを使用してコントローラにパラメータを渡す

アクションは、次のプロパティを使用できます

public ActionResult Books(int id, string type, string search) 
{ 
    //rest of the code 
} 

ビューの検索ボックスには、次のようになります。

@model ILookup<string, CityLibrary.Models.Library.Book> 
.... 
@using (Html.BeginForm("Books", "Collections", new { id = Model.First().First().CollectionId, type = ViewBag.BookType }, FormMethod.Get, null)) 
{ 
    <div class="input-group col-md-4"> 
     @Html.TextBox("search", null, new { @class = "form-control form-control-fixed-width", @placeholder = "Filter title..." }) 
     <span class="input-group-btn"> 
      <button class="btn btn-default" type="submit"> 
       <span class="glyphicon glyphicon-search"></span> 
      </button> 
     </span> 
    </div> 
} 

私は検索ボックスを提出していたときに問題が発生します。コントローラーアクションはidsearch文字列を取得しますが、typenullです。ViewBag.BookTypenullではありません。フィドラーはこれを示しています

GET /コレクション/書籍/ 2検索=完全リクエストでtypeパラメータを無視しているようだ検索語

?。ブラウザで

ソースコード:

<form action="/Collections/Books/2?type=available" method="get"> 
    <div class="input-group col-md-4"> 
     <input class="form-control form-control-fixed-width" id="search" name="search" placeholder="Filter title..." type="text" value="" /> 
     <span class="input-group-btn"> 
      <button class="btn btn-default" type="submit"> 
       <span class="glyphicon glyphicon-search"></span> 
      </button> 
     </span> 
    </div> 
</form> 

それはGETメソッドとは何かを持っていますか?私は基本的に同じコードで別のコントローラアクションを記述しなければならないので、POSTを避けたいと思います。

EDIT: GETリクエストを使用しようとすると問題が発生したようです。フォームをポストすると、実際にはすべてのパラメータがコントローラアクションに渡されます。何故ですか?

+0

のURLになります提出それは 'ViewBag.BookType'が**であることを示唆している** 「ヌル」。ビューに「

@ViewBag.BookType
」を追加して確認します。 –

+0

それはしません。 '@ViewBag.BookType'は、上のビュー(正しいヘッダーを表示するための単純な 'if/else'ステートメント)でも使用されます。私はまた、型のプロパティをハードコードしようとしました。 CollectionMod、Type = "available"}、FormMethod.Get、null)) 'も返す' Html.BeginForm( "Books"、 "Collections"、新しい{id = Model.First() 「ヌル」の「タイプ」。 – Dandry

+0

あなたは実際に '..../{id}/{type}'で定義されたルートを持っていますか(そうでなければルート値を追加できません) –

答えて

1

この動作は

(私の強調)、method="get"とフォームのために特に、HTML specificationsに従ったものである変異したアクションURL

先がある新しいURLとします<クエリ>コンポーネントがで置き換えられました。によってクエリが置き換えられました(U + 003F QUESTION MARK文字(? )適切であれば)。

したがって、フォームのaction属性のクエリ文字列値は、フォームコントロールの名前と値のペアで生成されたクエリ文字列に置き換えられます。これを解決する

つのオプション:

  1. BeginForm()方法からnew { type = ViewBag.BookType }を削除し、

    <input type="hidden" name="type" value="@ViewBag.BookType" /> 
    
  2. パラメータの隠し入力を追加するように、メソッドのカスタムルート定義を作成します。 typeは、クエリ文字列の値ではなく、ルートパラメータとして追加されます(デフォルトルートの前にある必要があります)。

    routes.MapRoute(
        name: "Books", 
        url: "Collections/Books/{id}/{type}", 
        defaults: new { controller = "Collections", action = "Books" } 
    ); 
    

    現在BeginForm()コードが

    <form action="/Collections/Books/2/available" method="get"> 
    

とフォームを生成するようにはCollections/Books/2/available?search=searchterm

+0

また、(私のようなMVCにはそれほど経験のない人のために)特に言及する価値があります。カスタム 'MapRoute'は' Default'の前に置かなければなりません。そうでなければ動作しません。 – Dandry

+0

@Dandry、私はすでに行いました - 2番目のポイントの終わりに、かっこで囲まれています:) –

+0

私を赦してください。これは、プレーンテキストではなくソースコードに集中しすぎると起こります。大いに感謝する! – Dandry

関連する問題