1

環境:使用MVC和Razor的實體框架(v6.0)。後端是SQL Server。帶實體框架的數字DropDownListFor - 未設置所選項目

對於數據庫中的字符串字段,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

有作爲'在HTML decimal'沒有這樣的事情。如果'CollarSize'的值完全匹配你的一個選項(即使用'ToString()')的值,那麼將顯示該選項 –

+0

謝謝。我嘗試過,但得到了InvalidOperationException。 _Templates只能用於字段訪問,屬性訪問,單維數組索引或單參數自定義索引器表達式._我試過:'@ Html.DropDownListFor(model => model.CollarSize.ToString(),' –

+0

否,我不是這麼做的!'CollarSize'的價值是什麼,如果它(比如說)'42'和你有'value =「42」'的選項,那麼它將被選中。「CollarSize」的值是否與您的某個選項的值完全匹配 –

回答

0

的問題是不是選擇列表的建設,但由於到底層數據庫模式。

的數據庫列:

CollarSize decimal(5, 2) NULL, 

我使用實體框架來構建從數據庫模型(嚮導選項「從數據庫EF設計」)。 EF產生的磁場中所生成的模型:

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

我產生填充DropDownListFor()選擇列表的包含小數點的項目清單,但這些項目有一個小數位,即精密15.0M 。但是,EF保留了原始精度,因此當DropDownList被填充時,Selected item無法找到,因爲它正在比較15.015.00

我的解決辦法是建立有明確精度的SelectList:

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