2015-02-08 63 views
1

我拉我的頭髮試圖讓下拉列表中我的剃刀視圖的工作,我無法找到一個可行的解決方案,我只能假設我失去了一些東西明顯..DropDownListFor總是空的回發

我正在嘗試創建一個註冊頁面,其中包含使用文本框(正常工作)和下拉列表從查找表中選擇項目並將該項作爲外鍵插入到我的新記錄中的學生的個人詳細信息。所以,我的學生有一個標題 - 我填充下拉列表中的所有Salutations & ID從我的數據庫中,允許用戶選擇一個,然後保存這與我的新學生記錄回發給控制器。下拉列表填充正常,值都在那裏,用戶可以選擇一個值,但在回發時它總是爲空?

下面給出的例子涉及到我的模型中只有一個這樣的領域,有很多。在試圖讓它起作用時,我使用了所有的文本框,並且只使用了一個下拉框,所以問題在某處,而不是隱藏在其他代碼中。

我的模型(ViewCandidate)有(與其他字段一起):

public int SalutationID {get; set;}//foreign key to be saved when I pass the values from my View object to a domain entity object 
public Dictionary<int, string> Salutations {get; set;} //key/value pairs to fill the dropdown in the view 

當我創建控制器的型號我填寫像這樣的下拉菜單:

public ViewResult Link() 
{  
    return View(new ViewCandidate{ Salutations = GetSalutations(entities) }); //'entities' is my Entity Framework context, all the entities in my data model/database 
} 

public static Dictionary<int, string> GetSalutations(DBEntities entities) 
{ 
    Dictionary<int, string> dictionary = new Dictionary<int, string>(); 
    foreach(var s in entities.Salutations) 
    { 
     dictionary.Add(s.SalutationID, s.Salutation); 
    } 
    return dictionary; 
} 

在我的剃鬚刀查看我使用的模型綁定是這樣的:

@model ViewModels.ViewCandidate 
... 

<div class="align-center"> 
     <label>Title</label> 
     @Html.DropDownListFor(x => x.SalutationID, new SelectList(Model.Salutations, "Key", "Value"), "Please select your title", new { @class="form-control"}) 
    </div> 

當我運行應用程序並導航到鏈接控制器頁面這是爲下拉菜單生成的html:

<div class="align-center"> 
<label>Title</label> 
<select class="form-control" data-val="true" data-val-number="The field SalutationID must be a number." data-val-required="The SalutationID field is required." id="SalutationID" name="SalutationID"><option value="">Please select your title</option> 
<option value="1">Mr</option> 
<option value="2">Mrs</option> 
<option value="3">Miss</option> 
<option value="4">Ms</option> 
<option value="5">Master</option> 
<option value="6">Doctor</option> 
</select> 
</div> 

使用正確的值生成下拉菜單就好了。但是,當我填寫表格的其餘部分,並提交後回來,我帶回到這裏在Visual Studio(從我的Razor視圖行):

@Html.DropDownListFor(x => x.SalutationID, new SelectList(Model.Salutations, "Key", "Value"), "Please select your title", new { @class="form-control"}) 

,出現以下錯誤:

An exception of type 'System.ArgumentNullException' occurred in System.Web.Mvc.dll but was not handled in user code

Value cannot be null.

Parameter name: items

'Items'是SelectList構造函數中IEnumerable的參數名稱,它具有項目並已全部呈現它們。在我的數據庫中或在視圖中呈現的salutation記錄都不爲NULL。我無法得到這個工作,它讓我發瘋,任何人都可以幫忙?

如果它有什麼區別我正在使用實體框架 - 所以我最終保存的實體是'Candidate',我將ViewCandidate中的值傳遞給視圖中創建的值。我重複創建Dictionary<int, string>的禮物是EF對象。在View對象中包裝這些也沒有幫助。

+0

當您返回視圖時,您需要重新分配Model.Salutations的值(由於Salutations爲空而出現錯誤) – 2015-02-08 21:11:04

回答

0

SalutationID在你的ViewModel中是一個變量,而不是屬性。嘗試更改爲:

public int SalutationID {get; set;} 

似乎變量不能發佈到控制器。

+0

吶喊沒有正確鍵入 - 它是我View中的一個屬性模型(public int SalutationID {get; set;}) - 從我的代碼複製/粘貼,我將編輯我的條目。感謝您指出! – thisextendsthat 2015-02-08 18:26:26

+0

@thisextendsthat視圖呈現正確,那麼您究竟在哪裏得到異常?它不能在'@ Html.DropDownListFor(x => x.SalutationID,new SelectList(Model.Salutations,「Key」,「Value」),「Please select your title」,new {@ class =「form-控制「})',除非問題發生在某種重定向之後?也可以嘗試在Controller中製作「SelectList」,然後將其傳遞給View。 – swistak 2015-02-08 18:49:42

+0

好,所以我改變了代碼在控制器中生成SelectList - ViewBag.Title = GetSalutations(entities) - 然後將我的Razor視圖更改爲下拉列表 - @ Html.DropDownListFor(x => x.SalutationID, (SelectList)ViewBag.Titles,「請選擇你的標題」,新的{@ class =「form-control」})。現在我得到一個完全不同的錯誤(cont) – thisextendsthat 2015-02-08 19:07:48

0

ModelSalutations的值在回發後是否爲null?如果是這樣,SelectList構造函數將拋出異常。您的表單中的提交將僅回發與具有數據值的表單元素相對應的數據。但是,這不包括選擇選項值。

我有一個類似的問題。原來我是在控制器HttpGet方法中填充我的Model.Salutations版本,但不是在HttpPost中。你可以嘗試添加這樣的事情你HttpPost方法的末尾:

model.Salutations = GetSalutations(entities); 
return this.View(model); 

希望有所幫助。