web-dev-qa-db-ja.com

ASP.NET MVCコントローラーでオプションパラメーターを使用する方法

2つのリストにリンクされたビューに一連のドロップダウンコントロールがあります。

//control
ViewData["Countries"] = new SelectList(x.getCountries().ToList(), "key","value",country);
ViewData["Regions"] = new SelectList(x.getRegions(country).ToList(), "id", "name", regions);

/*
on the view
*/

<% using (Html.BeginForm("","", FormMethod.Get))
           { %>
           <ol>
               <li>
                <%= MvcEasyA.Helpers.LabelHelper.Label("Country", "Country:")%>
                <%= Html.DropDownList("Country", ViewData["Countries"] as SelectList) %>
                <input type="submit" value="countryGO" class="ddabtns" />
               </li>
               <li>
                <%= MvcEasyA.Helpers.LabelHelper.Label("Regions", "Regions:")%>
                <%= Html.DropDownList("Regions", ViewData["Regions"] as SelectList,"-- Select One --") %>
                <input type="submit" value="regionsGO" class="ddabtns" />
               </li>
           </ol>     
                <br />
                <input type="submit" value="go" />
<% } %>

そのため、クエリを同じページに送信します(適切なドロップダウンを設定/更新する別の方法を提供するために実際にあるのは、これがすべてjavascriptに置き換えられるためです)。

クリック時のURLは次のようなものです...

http://localhost:1689/?country=FRA&regions=117

地域は国コードに依存しています。

この機能に関しては本当の意味がないので、ルーティングに煩わ​​されることなくこのビットを達成しようとしています。

そのため、コントローラーには次のメソッドがあります。

public ActionResult Index(string country, int regions)
39
Chris McKee

空の文字列として渡されるため、文字列は問題ないはずです。 intの場合、null可能にします:

public ActionResult Index(string Country, int? Regions)

また、クエリ文字列と同じように大文字にしたことに注意してください。

編集

ASP.NETでは、デフォルトのパラメーターを定義できるようになりました。例えば。:

public ActionResult Index(string Country, int Regions = 2)

しかし、私見では、セマンティックな意味がある場合にのみデフォルトを使用することをお勧めします。たとえば、Regionsパラメータの目的が国の地域の数を設定することであり、ほとんどの国に2つの地域(北と南)がある場合、デフォルトの設定は理にかなっています。入力の不足を示す「マジックナンバー」は使用しません(999や-1など)。その時点では、nullを使用するだけです。

78
James S

私はこれがかなり古いことを知っていますが、後世のために、C#2010(別名4.0、.NET 4でリリース)以降、 オプションの引数 を使用したい場合は- null許容型に付随する潜在的な落とし穴 。メソッドのシグネチャは次のようになります。

public ActionResult Index(string Country, int Regions = -1)
29
joelmdev