Asp.net mvc DropDownListFor(…)默认情况下选择布尔值false

Asp.net mvc DropDownListFor(…)默认情况下选择布尔值false,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-2,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 2,我在应用程序中有典型的YesNo下拉列表。为此,我开发了model而不是ViewModel实用程序类,用于将来的扩展 public string Text { get; set; } // represents text part public bool Value { get; set; } // represent value public List<DropDown> DropDowns { get; set; } //list for bind

我在应用程序中有典型的YesNo下拉列表。为此,我开发了model而不是ViewModel实用程序类,用于将来的扩展

public string Text { get; set; } // represents text part
        public bool Value { get; set; } // represent value
        public List<DropDown> DropDowns { get; set; } //list for binding
        public void BuildYesNoDropDown()
        {
            DropDowns = new List<DropDown>();
            DropDowns.Add(new DropDown { Text = "Yes", Value = true });
            DropDowns.Add(new DropDown { Text = "No", Value = false });
        }
在视图上,所有三个参数都将显示,即选择、是和否。但是,默认情况下,已选择否。如果我将Value属性设置为integer,那么它可以正常工作,默认情况下选择Select,但正如代码中提到的,如果我倾向于使用bool类型,则不会选择No

DataValueField为bool时如何获得正常行为?

模型:

public bool? Value { get; set; }
[Required]
public bool? Value { get; set; }
视图:

这会自动生成一个下拉列表,其中有3个状态与可空bool的3个状态相匹配:null、true、false。如果需要回答该值,可以使用如下数据注释:

型号:

[Required]
public bool? Value { get; set; }

外卖是你的模型需要是一个真实的模型-它需要对输入值从unset到set进行建模。如果您需要输入一个int,您可能会想使用一个可为null的int,所以int?并且需要值。这样,初始值将为null,而不是0。它与其他数据类型类似,但字符串已经可以为空。

我知道这是一个老话题,但我认为对于其他人来说,了解一些背景知识可能会有用

默认情况下选择“否”,因为布尔值的默认值为false

如果将模型设置为 在您的视图模型中这样的可空布尔值,那么默认情况下它应该选择您的默认值:

public bool? Value { get; set; }
然后在视图中设置dropdownlist,如下所示:

@Html.DropDownListFor(x => x.SelectedValue, new SelectList(Model.DropDowns, "Value", "Text",1),"{Default Select Value}")

这样做的结果应该是,当bool为null时,自动选择的选项应该是您的默认值{default Select value}

在我的例子中,我在同一页上有很多这样的下拉列表,我认为我应该聪明地重用选择列表,例如

var YesOrNoTriState = new List<SelectListItem> {
  new SelectListItem { Text = "Select", Value = "" },
  new SelectListItem { Text = "Yes", Value = true.ToString() },
  new SelectListItem { Text = "No", Value = false.ToString() }
};
在我看来

<%: Html.DropDownListFor(x => x.Field1, Model.YesOrNoTriState) %>
<%: Html.DropDownListFor(x => x.Field2, Model.YesOrNoTriState) %>
那没用。我为每个下拉列表初始化了一个单独的选择列表,解决了问题

看法


谢谢你的回复。但是,我想我的问题被误解了。当前,默认情况下,选择“否”为布尔值。相反,我想选择应该选择哪个选项标签。我会让其他人回答这个问题-你需要为他们提供下拉模型。没有足够的声誉发回代码…:我想,问题在于lambda表达式类型。在上面的代码中,x=>x.SelectedValue的类型是bool。这将强制引擎在提供的集合中选择最后一个false值。不过我不确定!我对Dropdownlist的了解还不够。。。浪费你的时间。x=>x.SelectedValue未设置,其默认值为false。因此,它将从列表中选择任何假值。你的可空解在这里很方便。谢谢你的时间。这对我们不起作用。没有值的默认NOT SET选项将无法通过验证。如果模型上有[Required]数据注释,则此选项无效。正确,需要使用javascript验证。对我来说,这是一种魅力!我刚刚遗漏了第三个参数选择。。。。。因为我在处理一个必填字段,所以它总是被填充的。
<%: Html.DropDownListFor(x => x.Field1, Model.YesOrNoTriState) %>
<%: Html.DropDownListFor(x => x.Field2, Model.YesOrNoTriState) %>
public bool flag { get; set; }
@Html.DropDownListFor(model => model.flag, new List<SelectListItem>()
{
   new SelectListItem() { Text = "Yes", Value = "True" },
   new SelectListItem() { Text = "No", Value = "False"}
}, "Select.....", new { @id = "flag", @class="form-control" })
@Html.ValidationMessageFor(model => model.flag)