如何在ASP.NET MVC控制器中使用可选参数

Chr*_*Kee 41 c# asp.net-mvc c#-3.0

我在视图上有一组链接到两个列表的下拉控件.

//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" />
<% } %>
Run Code Online (Sandbox Code Playgroud)

因此它将查询发送到同一页面(因为它只提供了另一种设置/更新相应下拉菜单的方法,这是可以接受的,因为它将全部用javascript替换).

点击的网址就像......

http://localhost:1689/?country=FRA&regions=117
Run Code Online (Sandbox Code Playgroud)

区域取决于国家/地区代码.

我正在努力实现这一点,而不必担心路由,因为关于这个功能没有真正的意义.

因此Controller具有以下方法.

public ActionResult Index(string country, int regions)
Run Code Online (Sandbox Code Playgroud)

Jam*_*s S 80

字符串应该没问题,因为它将作为空字符串传递.对于int,使其可为空:

public ActionResult Index(string Country, int? Regions)
Run Code Online (Sandbox Code Playgroud)

另外,你会注意到我将它与你的查询字符串相同.

编辑

请注意,ASP.NET现在允许您定义默认参数.例如:

public ActionResult Index(string Country, int Regions = 2)
Run Code Online (Sandbox Code Playgroud)

但是,恕我直言,我建议你只使用它具有语义意义的默认值.例如,如果Regions参数的目的是设置一个国家/地区的区域数量,并且大多数国家/地区都有两个区域(北部和南部),则设置默认值是有意义的.我不会使用表示缺少输入的"幻数"(例如,999或-1) - 此时你应该使用null.

  • 那么DateTimes呢? (3认同)
  • @Bruno - 使用`DateTime?` (3认同)

joe*_*dev 29

我知道这已经很老了,但是对于后人来说,重要的是要注意到C#2010(也就是4.0,与.NET 4一起发布),如果你想避免可空类型带来的潜在陷阱,你可以使用可选参数.您的方法签名如下所示:

public ActionResult Index(string Country, int Regions = -1)
Run Code Online (Sandbox Code Playgroud)

  • @ChrisMcKee我很清楚C#4在您的问题时尚未提供,但搜索仍然会让人们对这些问题感兴趣,尽管他们已经岁了 - 这就是我偶然发现的问题.除非问题明确针对某种技术,否则保持所提供的信息是最新的非常重要.就你的问题而言,它现在和4年前一样,只是现在有更好的解决方案. (3认同)