2013-06-12 60 views
0

下拉列表......我存在的基本禍根......選定值未在下拉列表中設置從在的SelectList MVC

我已經看到了這個問題的確切無數話題,但一切我已發現在這裏和周圍的互聯網沒有解決我的問題。

有點背景第一: 我有一個頁面,允許用戶編輯記錄。編輯頁面上的其中一個字段是填充客戶端的下拉列表。要進入編輯頁面,用戶點擊另一頁上的編輯鏈接,並在其上有記錄表。當他們到達編輯頁面時,窗體將填充選定記錄中的信息進行編輯。除了登錄屏幕外,它可能是任何網站移動數據的最基本和最常見的功能之一。

所以,這裏是從視圖代碼:

@Html.DropDownList("ClientsDropdown", (IEnumerable<SelectListItem>)ViewBag.ClientsDropdown, "Select a Client") 

,這裏是在控制器代碼:

[HttpGet] 
    public ViewResult Details(int id, int pageNumber = 1) 
    { 
     Invoice invoice = db.Invoices.Find(id); 
     FillClientDropdown(invoice); 
     var model = new InvoiceDetailsModel() { Invoice = invoice, PageNumber = pageNumber }; 
     return View(model); 
    } 

而且FillClientDropdown(發票)稱:

private void FillClientDropdown(Invoice invoice) 
    { 
     var clientList = db 
      .Clients 
      .OrderBy(x => x.Name) 
      .ToList() 
      .Select(x => new SelectListItem 
      { 
       Selected = (x.ID == invoice.ClientOcrStringID), 
       Text = x.Name, 
       Value = x.ID.ToString() 
      }); 

     ViewBag.ClientsDropdown = new SelectList(clientList, "Value", "Text", "Selected"); 
    } 

我已經證實clientList確實從數據庫中獲得了一個很好的客戶列表,並且正確SelectListItem將「選定」屬性設置爲True。

但是當我加載頁面,檢查下拉列表中,這是我得到:

<select id="ClientsDropdown" name="ClientsDropdown"> 
<option value="">Select a Client</option> 
<option value="1">Test Client 1</option> 
<option value="2">Test Client 2</option> 

我也能猜到,創建一個新的SelectList也將增加在選定=每種選擇都有「價值」,但似乎並非如此。

這個問題的任何幫助,將不勝感激,因爲它是相當令人沮喪,要知道,我可以在3分鐘左右已經這樣做了,如果我能夠使用Web窗體...

UPDATE

看起來像我得到它的工作!

這裏就是我所做的: 我已經有了一個InvoiceDetailsModel的工作,所以我說:

public SelectList ClientList { get; set; } 

然後,在我的InvoiceController,我改變了我的詳細一點:

[HttpGet] 
    public ViewResult Details(int id, int pageNumber = 1) 
    { 
     Invoice invoice = db.Invoices.Find(id); 
     var clientList = db 
      .Clients 
      .OrderBy(x => x.Name) 
      .ToList() 
      .Select(x => new SelectListItem 
      { 
       Text = x.Name, 
       Value = x.ID.ToString() 
      }); 
     var model = new InvoiceDetailsModel() { Invoice = invoice, PageNumber = pageNumber }; 
     model.ClientList = new SelectList(clientList, "Value", "Text", model.Invoice.ClientOcrStringID); 
     return View(model); 
    } 

可以充分利用我對InvoiceDetailsModel的補充。最後,在我看來,我改變了我的下拉菜單:

@Html.DropDownListFor(model => model.Invoice.ClientOcrStringID, Model.ClientList, "Select a Client") 

我希望這可以幫助某人......未來的任何人。

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

哎呀,對不起! – user1059903

回答

1

重構代碼是不使用ViewBag或ViewData的方式。這聽起來很愚蠢,但它會起作用,你會得到更好的代碼。

你要做的:

  • 創建一個視圖模型類,它可以得到從發票類
  • 添加加屬性:PAGENUMBER和選擇列表的
  • 在視圖中使用DropDownListFor幫手
+0

好吧,我正在處理別人的代碼,所以我沒有奢侈的重寫一大堆代碼。然而,我確實發現他們有一個我可以使用的ViewModel類。我遇到的問題是如何去設置SelectedValue屬性。 – user1059903

相關問題