2016-11-28 46 views
0

我建立一個MVC的Web應用程序和我即將穿牆跑我的頭,還有對這個已經是十幾個主題和所有已接受不爲我工作的解決方案。可能有一些真正愚蠢和簡單的我忘記/看不到,但似乎無法解決。 請不要恨我命名;我正在繼續一個由別人開始的項目。DropDownListFor沒有預選值

我在ManageDetail.cshtml以下行:

@Html.DropDownListFor(m => m.ChecklistWaarde.SoortID, Model.ChecklistOptionsOptions, "Choose a value", new { @class = "form-control" }) 

此建立了基於財產Model.ChecklistWaarde.SoortID,這是一個整數一個選擇框。傳遞的下一個參數是由以下非常簡單的輔助函數生成的模型中的SelectList:在二級數據庫中執行DB查找(不幸),它接收參數SoortID以及設置預選值:

public SelectList GetChecklistOptions(int selectedId = -1) 
    { 
     var soorten = new List<SelectListItem>(); 
     try 
     { 
      using (var connection = new SqlConnection(mssqlConnectionString)) 
      { 
       connection.Open(); 
       SqlCommand command = connection.CreateCommand(); 
       command.CommandText = "Select Naam, ID From ChecklistSoorten"; 
       SqlDataReader reader = command.ExecuteReader(); 
       while (reader.Read()) 
       { 
        var id = reader["ID"] as int?; 
        if (id.HasValue) 
        { 
         soorten.Add(new SelectListItem { Text = reader["Naam"] as string, Value = id.Value.ToString(), Selected = id.Value.Equals(selectedId) }); 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      Globals.Log.Error(ex); 
     } 

     return new SelectList(soorten, "Value", "Text");    
    } 

它被調用的控制器是這樣的:

public ActionResult ManageDetail(int? id) { 
    var model = new MachineDetailsModel(id); 
    model.ChecklistOptionsOptions = sqlDal.GetChecklistOptions(model.ChecklistWaarde.SoortID); 
    return View("ManageDetail", model); 
} 

當我嘗試調試我的代碼,我可以看到,該模型值正確填充:

  • SoortID有2(int)的值
  • Model.ChecklistOptionsOptions有人口SelectLis
  • 在檢查SelectList我發現,只有與價值項目「2」的屬性Selected = true,這是false爲所有其他人。
  • 表單呈現時,它不會選擇值爲2的項目,而是會選擇第一個項目「選擇一個值」
  • 檢查HTML,我發現值爲2的項目的確是沒有被選中,與我期待的相反(請參閱下面的HTML;爲了可讀性而在計數和文本中縮短了列表)。我期望看到第2項的「已選中」,因爲它是在SelectList中選定的。

<select class="form-control" data-val="true" data-val-number="The field SoortID must be a number." data-val-required="The SoortID field is required." id="ChecklistWaarde_SoortID" name="ChecklistWaarde.SoortID" style="min-width:100%;"> 
 
      <option value="">Choose a value</option> 
 
\t \t  <option value="1">Item A</option> 
 
\t \t  <option value="2">Item B</option> 
 
\t \t  <option value="3">Item C</option> 
 
\t \t  <option value="4">Item D</option> 
 
\t  </select>

我缺少什麼?如何選擇值爲「2」的項目,因爲它在SelectList中,我將其傳遞給DropDownListFor()函數?

+0

在將模型傳遞給視圖之前,您需要在GET方法中設置屬性'SoortID'的值。並且設置'SelectListItem'的'Selected'屬性是毫無意義的(綁定到model屬性時忽略它)。而更無意義的是,從第一個使用'new SelectList(...)'創建另一個'SelectList' - 只需使用'return soorten;' –

+0

@StephenMuecke SoortID在模型的構造函數中設置,所以它已經設置爲風景。 只是通過列表索引而不是新的SelectList的好建議將改變這一點。 –

+0

如果'SoortID'的值與您的其中一個選項相匹配,那麼它將在視圖中被選中。如果不是,那麼你還沒有告訴我們其他的東西。 –

回答

0

在您被填充SelectList控制器,設置選擇的值有,你的代碼看起來像:

if (id.HasValue) 
{ 
    soorten.Add(new SelectListItem 
        { 
         Text = reader["Naam"] as string, 
         Value = id.Value.ToString() 
        }); 
} 

,然後在實例SelectList的線下:

return new SelectList(soorten, "Value", "Text",selectedId); 

,或者你可以消除SelectList,而是在您的型號中將屬性ChecklistOptionsOptions類型更改爲List<SelectListItem>,在這種情況下,創建SelectList的最後一行不會是r進一步確定,現在你正在多次創建它。

+0

事實上,我不是將SelectId作爲第四個參數傳遞給SelectList構造函數,而是爲SelectListItem本身設置Selected,並且如Stephen Muecke所述。更改我的代碼以將其傳遞給SelectList的構造函數確實可行 - 謝謝! –

0

最終一切都在被渲染的觀點來自ViewData。這需要模型,但也需要數據和'ModelState`。

當某些請求參數的名稱與某些模型參數衝突時,我遇到了這種問題。這會覆蓋模型中的值並導致問題。

調試非常困難,因爲通常看起來所有正確的值都已設置。如果有疑問,請檢查所有參數名稱。