MVC 4: 如何使DropDownListFor返回0作为optionLabel值?

5

我有一个创建视图,里面有多个DropDownListFors。每次创建新对象时,只有1个DropDownListFors应该有值,当选项标签被选中但未选择任何选项时,我希望其他下拉列表返回0作为结果。

如何将0分配为DropDownListFor的optionLabel的值?

编辑: 以下是我在视图中的DropDownListFor代码示例:

@Html.DropDownListFor(model => model.cardReward.ID, new SelectList(ViewBag.cardReward, "Id","Name"), "None")

当我渲染页面时,它会创建一个列表,并在顶部添加None,如下所示:
<option value>None</option>

我希望它能像这样:

<option value="0">None</option>

你有尝试过一些代码吗?这将帮助我们更好地理解您想要实现的内容。 - Cameron Tinker
1
在你的控制器操作中,将 null 替换为零。 - ataravati
添加了一些示例代码以及我得到的/想要得到的示例。 - Chris Stevens
除了ataravati的评论外,一些[(nullablething) ?? 0]可能会有帮助! - Stachu
你能发布你的模型吗? - ataravati
2个回答

10
DropDownFor 的文档中,optionLabel 参数(你传递的值为 "None")被描述为:

默认空项的文本。

因此,它被设计为始终为空。您需要向选择列表中添加一个附加项,以获得0值。

我已使用以下扩展方法来实现这一点(抱歉未经测试,可能存在轻微错误):

public IEnumerable<SelectListItem> InsertEmptyFirst(this IEnumerable<SelectListItem> list, string emptyText = "", string emptyValue = "")
{
    return new [] { new SelectListItem { Text = emptyText, Value = emptyValue } }.Concat(list);
}

你可以这样使用它:

@Html.DropDownListFor(model => model.cardReward.ID, new SelectList(ViewBag.cardReward, "Id","Name").InsertEmptyFirst("None", "0"))

谢谢,那么当您想要为用户提供从下拉列表中不选择选项的能力时,这是最好的选择吗? - Chris Stevens
这看起来不错,但在我看来完全没有必要。DropDownList中的optionLabel会给你一个null值,你可以在控制器中轻松地将其转换为0。 - ataravati
实际上,我现在在尝试提交表单时遇到了一个新的错误。我的调试器告诉我第一个DropdownListFor遇到了“值不能为空”。即使我选择了下拉列表的值,我仍会得到这个错误。有任何想法吗? - Chris Stevens
@ataravati我的视图不允许我为下拉列表提交空值,如何禁用DropdownListFor的验证? - Chris Stevens
这让我有了一个开始,但最好的方法是https://dev59.com/knRB5IYBdhLWcg3wSVi1#30582746。 - Manish

1
在此插入一个新的空字符串,以下是一个示例。
@Html.DropDownListFor(x => x.ProjectID, Model.Projects, string.Empty)

1
不,该值将为 null,而不是 0 - Andrew

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