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

46

我在一个视图上有一组下拉控件,它们与两个列表相关联。

//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)
2个回答

87
字符串应该没问题,因为它将作为空字符串传递。对于 int ,使其可空:
public ActionResult Index(string Country, int? Regions)

同时,您会注意到我像查询字符串一样将其首字母大写。

编辑

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

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

但是,我个人建议只在语义上有意义的情况下使用默认值。例如,如果“地区”参数的目的是设置一个国家中的地区数量,并且大多数国家都有2个地区(北部和南部),那么设置默认值是有意义的。我不会使用表示缺少输入的“魔法数字”(例如999或-1)-此时应该使用null


使用视图模型时,如何分配默认值? - Zapnologica

34

我知道这已经很旧了,但为了后人,请注意自C# 2010(又名4.0,随.NET 4发布)起,您可以使用可选参数,如果您想避免可空类型带来的潜在问题。您的方法签名将如下所示:

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

4
我知道你在发布问题时可能没有使用C# 4,但即使这些问题已经存在多年,搜索仍然会引导人们来查看它们,这就是我发现这个问题的原因。除非问题明确特定于某种技术,否则保持提供的信息更新很重要。对于你的问题而言,现在与4年前相比读起来一样,只不过现在有更好的解决方案。 - joelmdev
1
我不再使用C#,并且不能/不会评论这是否是当前的最佳实践(您基本上是用-1替换null,这在我的感觉中一直更加脆弱...但我不在这里争论/辩论)。然而,我完全同意,由于许多人仍然遇到这个问题,无论最佳实践是什么都应该可用。我更愿意编辑我的原始答案并链接到一个新的提问/回答问题。 - James S
@JamesS ScottGu在这里谈到了他的偏好:http://weblogs.asp.net/scottgu/optional-parameters-and-named-arguments-in-c-4-and-a-cool-scenario-w-asp-net-mvc-2,即采用“int Regions = -1”的方法。 - ShawnFeatherly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接