DropDownListFor始终选择值为0的项目

3

我遇到了一个问题,无论如何尝试,asp.net和razor引擎都不能正确选择下拉列表中的元素。如果可用值之一是“0”,那么将始终选择该项目。

我想创建的是一个评分选择器,范围从-2到2,其中0是中间值,但不应预先选择。用户应被迫做出决定,因此默认值应为空。

使用类似下面代码所示的选项标签创建下拉列表不会保留默认为空。如果值为1-5,这样就可以工作。

@Html.DropDownListFor(model => model.Rating, new SelectList(new List<SelectListItem>()
{
    new SelectListItem() {Text = "-2", Value = "-2"},
    new SelectListItem() {Text = "-1", Value = "-1"},
    new SelectListItem() {Text = "0", Value = "0"},
    new SelectListItem() {Text = "1", Value = "1"},
    new SelectListItem() {Text = "2", Value = "2"}
}, "Value", "Text"), String.Empty, new { @class = "rating-select" })

上述代码将选中的标签添加到了第0个项目,并创建了以下html代码:
<select class="rating-select valid" data-val="true" data-val-number="The field Rating must be a number." data-val-required="Rating is required." id="Rating" name="Rating">
    <option value=""></option>
    <option value="-2">-2</option>
    <option value="-1">-1</option>
    <option selected="selected" value="0">0</option>
    <option value="1">1</option>
    <option value="2">2</option>
</select>

我尝试过所有选择空值的版本,但结果都相同;生成了一个带有选定标签的0项。

创建一个带有选定属性的空项

@Html.DropDownListFor(model => model.Rating, new SelectList(new List<SelectListItem>()
{
    new SelectListItem() {Text = "Null", Value = "", Selected = True},
    new SelectListItem() {Text = "-2", Value = "-2"},
    new SelectListItem() {Text = "-1", Value = "-1"},
    new SelectListItem() {Text = "0", Value = "0"},
    new SelectListItem() {Text = "1", Value = "1"},
    new SelectListItem() {Text = "2", Value = "2"}
}, "Value", "Text"), String.Empty, new { @class = "rating-select" })

创建一个空的项目对象,并将该对象设置为selectlist中选定的对象。
@{SelectListItem blankItem = new SelectListItem() {Text = "Null", Value = ""}}
@Html.DropDownListFor(model => model.Rating, new SelectList(new List<SelectListItem>()
{
    blankItem,
    new SelectListItem() {Text = "-2", Value = "-2"},
    new SelectListItem() {Text = "-1", Value = "-1"},
    new SelectListItem() {Text = "0", Value = "0"},
    new SelectListItem() {Text = "1", Value = "1"},
    new SelectListItem() {Text = "2", Value = "2"}
}, "Value", "Text", blankItem), String.Empty, new { @class = "rating-select" })

当其中一个值为0时,以上解决方法均无效。

是否有人知道正确的解决方案或者这是否是框架的bug?

我可以通过一些变通的方法来解决,但我宁愿不要......

2个回答

5
我会查看model.Rating属性的类型,我假设它是一个整数。如果这是一个(int)类型且您没有提供值,则当它传递到视图时,它将绑定为0。因此,在处理视图时,0将被标记为选定状态,这是视图引擎认为正确的值,并且将覆盖您手动选择的选定值。尝试将model.Rating属性更改为可空整数(int?),看看是否有相同的问题。
其次,您可以考虑使用一个快速的jQuery函数将下拉列表重置为第一个提供的值,但这可能比您想要的更加“hacky”。

当然,那很有道理。第二次尝试使用其他值时,即使没有“0”,也没有选择我的值,因为它从模型中获取了值。现在有意义了,但很难找到有关此问题的其他问题或信息。在这种情况下,将评分改为可空 int?而不是字符串。空选项工作正常!谢谢! - Leo
是的,模型将始终*覆盖任何手动选择的值,在默认值的情况下,很容易忽略。很高兴能帮助您让项目正常运行! *(免责声明:我相信在某些边缘情况下这并不正确,但一般来说,这是一个有效的陈述) - Tommy

2
解决方案是要么避免一个项目的值为0,因为Rating是一个int(默认值为0),要么通过使用Html.DropDownList来自己处理DropdownList的绑定。如果选择后者,您还必须在绑定时指定用户选择的项目的Selected属性。

是的,谢谢!按照上面的建议,将其设为可为空的确起到了作用。 - Leo
指引我朝着正确的方向。在不设置optionalLabel参数的情况下使用DropDownListFor将正确地从模型中选择值。如果设置了optionLabel,则它总是选择该值,除非您首先在模型上设置Selected属性... - Jason

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