2011-10-06 61 views
6

我有典型的是没有在应用程序中的下拉类型。为此,我为未来的扩展pr​​upose开发了模型(而不是ViewModel Utility)。DropDownListFor(...)默认情况下选择布尔值false

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 }); 
     } 

然后,我将它绑定在视图像以下:

@Html.DropDownListFor(x => x.SelectedValue, new SelectList(Model.DropDowns, "Value", "Text",1),"Select") //last para - OptionLabel 

在视图,所有三个参数都得到的显示,即“选择”,“是”和“否”。但是,默认情况下选择了“否”。如果我将“Value”属性设置为整数,那么它可以正常工作,默认情况下选择“Select”,但如代码中所述,如果我倾向于使用bool类型,则选择“No”。

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

回答

7

型号:

public bool? Value { get; set; } 

查看:

@Html.EditorFor(model => model.Value) 

这将自动下拉列表与匹配3个状态为null的布尔的是3种状态:空,虚,实。如果您需要值来回答,您可以使用数据标注,像这样:

型号:

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

外卖是你的模型需要一个真正的模型 - 它需要从取消设置输入值模型设置。如果你需要输入一个int,你可能会想要使用一个可为空的int(所以int?)并且需要该值。这样,初始值为零而不是0.它与其他数据类型相似,但string已经可以为空。

+0

感谢您的答复。但是,我想我的问题被误解了。目前,默认情况下使用bool值选择“NO”。相反,我希望选择OptionLabel的“Select”。 – StartingFromScratch

+0

我会让其他人回答这个问题 - 你需要为他们提供'DropDown'模型。 – Cymen

+0

没有足够的声望来回传代码...... :(我猜,问题是使用l​​ambda表达式类型。在上面的代码中,x => x.SelectedValue的类型是bool。这会强制引擎选择最后的“false “提供的集合中的值,我不确定! – StartingFromScratch

1

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

没有被默认选中,因为布尔的默认值为false

,如果你刚才设置的模型是一个 为空的布尔像这样在您的视图模型,那么它应该在默认情况下选择默认值。 :

public bool? Value { get; set; } 

,然后你只需设置你的下拉列表这样的观点:

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

这样的结果应该是,当布尔是空自动选择的选项应该是默认值{Default Select Value}

3

在我的情况下,我在同一页面上有一堆下拉菜单,我想我会很聪明并重用选择列表,例如

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) %> 

。我初始化一个单独的选择列表中为每个下拉,并且解决了这一问题

9

视图模型

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) 
+0

如果在模型上有'[Required]'数据注释,则这不起作用。 –

+1

需要使用正确的javascript验证。 – JoshYates1980

+1

对我来说就像一个魅力!我刚刚排除了第三个参数“选择.....”,因为我正在处理一个必填字段,因此它将始终填充。 – Reddy

相关问题