2014-04-24 43 views
0

您好我在編輯視圖上的DropDownListFor有問題。如何在編輯視圖中使用DropDownListFor

基本上我使用的是包含我的表單的部分視圖,而在我的編輯和創建視圖中,我稱之爲局部視圖。

我有5類似DropdownlistFor和這些工作以及創建操作,但在編輯沒有,主要是我沒有得到(無法)設置選定的值。

在我的編輯動作(GET)中,如果真實對象的屬性已滿,我填充屬性ViewModel。

if(icb.BAOfficer != null) 
editICB.BAOfficer = icb.BAOfficer; 


List<Staff> staffs = _fireService.GetAllStaffs().ToList(); 
staffs.Insert(0, new Staff { StaffId = -1, Name = "" }); 
editICB.BAOfficers = staffs; 

return View(editICB); 

這就是我如何填充我的下拉列表以及如何設置選定的值。

@Html.DropDownListFor(model => model.BAOfficerSelected, new SelectList(Model.BAOfficers, "StaffId", "Name", (Model.BAOfficer!= null ? Model.BAOfficer.StaffId:-1)), new { @class = "rounded indent" }) 
@Html.ValidationMessageFor(model => model.BAOfficer.StaffId) 
+0

你可以發表你如何建立'Model.BAOfficers'嗎? –

+0

我用它編輯了帖子。 – CidaoPapito

回答

0

我解決了在Edit Action中爲我的model.BAOfficerSelected設置一個值的問題,這是(容易的)祕密。

我需要第一個項目像一個空的選項,因爲不是一個必需的信息,但在編輯視圖,如果有價值我需要將其設置爲選定的選項。

最後,它是我的代碼。

我的模型

public int BAOfficerSelected { get; set; } 
public SelectList BAOfficers { get; set; }` 

我的控制器創建/編輯操作

if (icb.BAOfficer != null) // only for edit action 
editICB.BAOfficerSelected = icb.BAOfficer.StaffId; //this will set the selected value like a mapping 


//for Edit and Create 
List<Staff> staffs = _fireService.GetAllStaffs().ToList(); 
staffs.Insert(0, new Staff { StaffId = -1, Name = "" }); 

editICB.BAOfficers = new SelectList(staffs, "StaffId", "Name"); 

return View(editICB);` 

我查看

@Html.DropDownListFor(model => model.BAOfficerSelected, Model.BAOfficers, new { @class = "rounded indent" }) 

我希望這可以幫助別人。

0

而不是使用一個SelectList的,我經常發現它的工作原理最好使用List<SelectListItem>

此外,我通常使用EditorTemplate作爲我的下拉菜單,以保持我的視野清潔。

所以,如果我的選擇列表返回List<SelectListItem>

public List<SelectListItem> BAOfficers { get; set }; 

你可以將它設置這樣的:

model.BAOfficers = staffs.Select(staff => 
     new SelectListItem { Text = staff.Name, Value = staff.StaffId }).ToList(); 

然後在您的EditorTemplate

<!-- EditorTempaltes\DropDownList.cshtml --> 
@model System.String 
<p> 
    @Html.LabelFor(m => m): 
    @Html.DropDownListFor(m => m, new SelectList(
     (List<SelectListItem>)ViewData["selectList"], "Value", "Text", 
     String.IsNullOrEmpty(Model) ? String.Empty : Model), String.Empty) 
    @Html.ValidationMessageFor(m => m) 
</p> 

然後在查看,只需將SelectList傳入EditorTemplate

@Html.EditorFor(m => m.BAOfficerSelected, "DropDownList", 
       new { selectList = Model.BAOfficers() }) 
+0

我如何將列表轉換爲List ?我只是可以看到它使用循環,但不好看使用從列表讀取的foreach和填充列表。你的想法是什麼? – CidaoPapito

+0

@CidaoPapito我已經添加了一個如何在'staffs'對象上使用Linq表達式來構建列表的例子。 –

+0

謝謝。我找到了解決問題的方法,併發布了它。我會測試你的建議並設置爲有用的。好?我需要學習可愛的EditTemplates,所以我可以從它開始。 – CidaoPapito

0

這樣做的最好和最乾淨的方法是在服務器端設置SelectList對象中的選定值。

所以,如果你的BAOfficerSelected是可以空的......它更簡單:你不需要依靠添加一個虛擬物品來保持-1沒有選定的值。

相反,你做這種方式:

List<Staff> staffs = _fireService.GetAllStaffs().ToList(); 
editICB.BAOfficers = new SelectList(staffs, "StaffId", "Name", editICB.BAOfficer != null ? editICB.BAOfficer.StaffId : null); 

當然,BAOfficers需要被改變類型從List<Staff>SelectList

然後,在你的局部視圖你這樣做:

@Html.DropDownListFor(model => model.BAOfficerSelected, Model.BAOfficers, "Select one...", new { @class = "rounded indent" }) 

添加需要的第三個參數來表示默認值(如果沒有被選中)是文本。

+0

看起來不錯,但選定值的條件有以下錯誤。 'editICB.BAOfficer!= null?編輯ICB.BAOfficer.StaffId:null' **無法確定條件表達式的類型,因爲'int'和''之間沒有隱式轉換** ** – CidaoPapito

+0

'BAOfficerSelected'需要爲空(int''int?') 。你能改變它的類型嗎? – Romias

+0

我看到錯誤但未修復時更改。 錯誤發生在** icb.IncidentCommander.StaffId:null ** 整行;編輯ICB.IncidentCommander!= null?** icb.IncidentCommander()。 .StaffId:null **);' – CidaoPapito

相關問題