【问题标题】:Numeric DropDownListFor with Entity Framework - Selected item not being set带有实体框架的数字 DropDownListFor - 未设置所选项目
【发布时间】:2015-10-25 11:52:42
【问题描述】:

环境:带有 MVC 和 Razor 的实体框架 (v6.0)。后端是 SQL Server。

HTML 帮助程序 DropDownListFor() 非常适合数据库上的 string 列。但是,当我使用带有数字下拉列表的 decimal 列时,框架在呈现表单时不会选择从数据库加载的值。

我认为这与 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;
}

【问题讨论】:

  • html中没有decimal这样的东西。如果CollarSize 的值与您的选项之一的值完全匹配(即使用ToString()),则将显示该选项
  • 谢谢。我试过了,但得到了 InvalidOperationException。 模板只能用于字段访问、属性访问、单维数组索引或单参数自定义索引器表达式。我试过:@Html.DropDownListFor(model =&gt; model.CollarSize.ToString(),
  • 不,我不是故意的! CollarSize 的值是多少。如果它(比如说)42 并且您有value="42" 的选项,那么它将被选中。 CollarSize 的值是否与您的选项之一的值完全匹配
  • 是的,有一个匹配项,例如CollarSize = 15.0,CollarSizeSelect 有一个“15.0”条目(字符串)。
  • 对我来说很好 - 请参阅此DotNetFiddle。我怀疑CollarSize.ToString() 没有返回"15.0"

标签: asp.net-mvc entity-framework razor html.dropdownlistfor selectlistitem


【解决方案1】:

问题不在于 SelectList 的构造,而在于底层数据库架构。

数据库列:

CollarSize decimal(5, 2) NULL,

我使用实体框架从数据库构建模型(向导选项“数据库中的 EF 设计器”)。 EF在生成的模型中生成了字段:

public Nullable<decimal> CollarSize { get; set; }

我为填充 DropDownListFor() 生成的 SelectList 包含一个小数项列表,但这些项的精度为小数点后一位,即 15.0M。但是,EF 保留了原始精度,因此当填充 DropDownList 时,无法找到 Selected 项,因为它将 15.015.00 进行比较。

我的解决方案是明确精确地构建 SelectList:

public IEnumerable<SelectListItem> CollarSizeSelect
{
    get
    {
         return new SelectList(new List<decimal> { 14.00M, 14.50M, 15.00M, 15.50M...
    }
}

【讨论】:

    猜你喜欢
    • 2017-04-20
    • 2015-01-30
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多