web-dev-qa-db-ja.com

MVCコントローラーでクエリ文字列変数を使用する

私はC#.net MVCが初めてで、FullCalendarをMVCアプリケーションに追加しようとしています。

FullCalendarスクリプトは自動的に?start={}&end={}をURLに追加します...これは問題ありませんが、コントローラーでquerystring変数を使用する方法がわかりません。

Webformsアプリケーションで使用した方法は機能しません。 querystring変数にアクセスするには、コントローラーに何を追加する必要がありますか?

52
davids
public ActionResult SomeAction(string start, string end)

フレームワークは、クエリ文字列パラメーターをメソッドパラメーターにマップします。

84
Maess

私はそれを理解しました...最終的に別の 記事 を見つけました。

string start = Request.QueryString["start"];

string end = Request.QueryString["end"];
73
davids

デビッド、私はあなたとまったく同じ問題を抱えていました。 MVCは直感的ではなく、設計したときに、キッドはMVCの直感的なクエリ文字列システムの目的や重要性を理解していなかったようです。

ルートにクエリ文字列がまったく設定されていません(RouteConfig)。これらは、コントローラーのアクションへのアドオン「追加」パラメーターです。 Actionパラメーターはパスとクエリ文字列の両方を処理するように設計されているため、これは非常に混乱します。パラメーターを追加しても機能しなかった場合は、クエリ文字列に2番目のパラメーターを追加します。

これは、IDをキャッチするControllerクラスのアクションになります(実際には、MVCの一般的なデフォルトパスとしてRouteConfigファイルに設定された単なるパスです)。

public ActionResult Hello(int id)

ただし、クエリ文字列をキャッチするには、コントローラーの追加パラメーターを追加する必要があります(ちなみに、RouteConfigファイルでは設定されていません)。

public ActionResult Hello(int id, string start, string end)

これは、RouteConfig.csで「id」がオプションに設定されていると想定して、「/ Hello?start =&end =」または「/ Hello /?start =&end =」または「/ Hello/45?start =&end =」をリッスンするようになりました。ファイル。

RouteConfigファイルに「id」パスのない「カスタムルート」を作成する場合は、そのファイルでのアクション後に「id」またはその他のパラメーターを省略できます。その場合、コントローラーのActionメソッドのパラメーターはクエリ文字列のみを処理します。

これは非常に混乱しているので、あなたは一人ではありません! RouteConfigファイル構成設計で、特定の名前付き文字列、任意のクエリ文字列名、および任意の数のクエリ文字列の両方にクエリ文字列ルートを追加する簡単な方法を設計する必要がありました。そうしないと、MVC Webアプリケーションでのクエリ文字列の使用全体が疑わしいままになります。これは、1990年代半ば以降、クエリ文字列がWorld Wide Webの安定した部分であるため、かなり奇妙です。 :(

2
Stokely

私の問題は、クエリ文字列パラメータをデフォルト値で上書きすることでした:

routes.MapRoute(
    "apiRoute", 
    "api/{action}/{key}", 
    new { controller = "Api", action = "Prices", key = ""}
);

クエリ文字列にプラグインしたもの、またはkey=""のみの結果に関係なく。

次に、UrlParameter.Optionalを使用してデフォルトの上書きを取り除きました。

routes.MapRoute(
    "apiRoute", 
    "api/{action}/{key}", 
    new { controller = "Api", action = "Prices", key = UrlParameter.Optional }
);

prices/{key} 

または

prices?key={key} 

両方ともうまくいきます。

1
spugna

これが私が思いついたものです。私はこれで大きな問題を抱えていて、私は現在MVC 6にいると信じていますが、これは将来自分自身にも役立つかもしれません。

//問題は、Reqest.Form Request.QuerystringとRequestがMVCで機能しないことでした。ソリューションはContext.Request.Formを使用し、フォームが送信されていることを確認することです。

     if(Context.Request.ContentLength != null)
     {
         String StartDate = Context.Request.Form["StartMonth"].ToString();
         String EndMonth = Context.Request.Form["EndMonth"].ToString();
        // Vendor

     }
0
Deathstalker