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-item 中添加了一个 selected 标签,并创建了以下 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-item 使用选定的标签生成。

使用 Selected = true 创建一个空白项

@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" })

创建一个空白项目对象并将对象设置为在选择列表中选择

@{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 时,以上都不起作用。

有谁知道适当的解决方案,或者这是否是框架中的错误?

我可以通过变通方法解决它,但我宁愿不...

4

2 回答 2

5

我会看看 model.Rating 属性的类型是什么,我假设它是一个 int。如果这是一种(int)类型并且您没有提供值,那么当它遇到视图时它将被绑定到 0。因此,当视图被处理时,0 将被标记为选中,这是视图引擎认为正确的值,并将覆盖您手动选择的选定值。尝试将 model.Rating 属性设为可为空的 int(int?)并查看您是否有同样的问题。

其次,您总是可以查看一个快速的 jQuery 函数来将下拉列表重置为第一个提供的值,但这可能比您正在寻找的更“hacky”。

于 2013-08-14T15:05:01.267 回答
2

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

于 2013-08-14T15:09:51.760 回答