环境:带有MVC和Razor的实体框架(v6.0)。后端是SQL Server。
HTML帮助程序DropDownListFor()适用于数据库上的字符串列。但是,当我使用带有数字下拉列表的十进制列时,框架在呈现表单时不会选择从数据库加载的值。
我认为这与DropDownListFor()包含Text和Value的字符串,并且无法匹配数据库中的十进制值这一事实有关,因此未确定SelectedItem。
我尝试在HTML帮助程序中进行转换,但在编译或运行时都失败了。我能找到的所有例子都假设您要选择字符串,而不是数字。
感激不尽的任何帮助。 感谢。
查看代码:问题字段为 CollarSize 。下拉列表是CollarSizeSelect。
<div class="form-group">
@Html.LabelFor(model => model.CollarSize, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.CollarSize, Model.CollarSizeSelect, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.CollarSize, "", new { @class = "text-danger" })
</div>
</div>
类定义包含由此定义的列:
public Nullable<decimal> CollarSize { get; set; }
CollarSize下拉列表构建如下:
public IEnumerable<SelectListItem> ChestSizeSelect
{
get
{
return GetSelectNumberRange(32, 60, (decimal)1.0);
}
}
private static List<SelectListItem> GetSelectNumberRange(int start, int end, decimal increment)
{
List<SelectListItem> numlist = new List<SelectListItem>();
for (decimal i = start; i <= end; i = i + increment)
{
numlist.Add(new SelectListItem() {Text = i.ToString(), Value = i.ToString()});
}
return numlist;
}
答案 0 :(得分:1)
问题不在于构建SelectList,而是由于底层数据库架构。
数据库专栏:
CollarSize decimal(5, 2) NULL,
我使用Entity Framework从数据库构建模型(向导选项“EF Designer from database”)。 EF在生成的模型中生成了字段:
public Nullable<decimal> CollarSize { get; set; }
我生成的用于填充DropDownListFor()的SelectList包含一个小数项列表,但这些项的精度为小数点后一位,即 15.0M 。但是,EF保留了原始精度,因此当填充DropDownList时,无法找到Selected项,因为它将 15.0 与 15.00 进行比较。
我的解决方案是使用显式精度构建SelectList:
public IEnumerable<SelectListItem> CollarSizeSelect
{
get
{
return new SelectList(new List<decimal> { 14.00M, 14.50M, 15.00M, 15.50M...
}
}