2013-04-07 40 views
0

我有一個返回列表項的方法。問題發生時,當我嘗試使用此項目填充DropDownList。我每次都會得到一個空的異常。漁獲何處?DropDownListFor問題

方法:

public IEnumerable<SelectListItem> GetItems() 
    { 
     List<SelectListItem> list = new List<SelectListItem>(); 

     list.Add(new SelectListItem { Text = "Ptuj", Value = "1" }); 
     list.Add(new SelectListItem { Text = "Celje", Value = "2" }); 
     list.Add(new SelectListItem { Text = "Laško", Value = "3" }); 
     list.Add(new SelectListItem { Text = "Maribor", Value = "4" }); 
     list.Add(new SelectListItem { Text = "Ljubljana", Value = "5" }); 
     list.Add(new SelectListItem { Text = "N/A", Value = "6" }); 


     foreach (SelectListItem item in list) 
     { 
      yield return item; 
     } 
    } 

查看:

@Html.LabelFor(model => model.PlaceOfBirth) 
     @Html.DropDownListFor(model => model.PlaceOfBirth, //Exception thrown in this line 
     Model.GetItems()) 

回答

0

我改變了列表到的SelectList。你已經使用了SelectListItems,所以你可以去整個豬羣並使用SelectList。

然後,只需返回SelectList。您可以將簽名返回類型保留爲IEnumerable,因爲SelectList類實現了該接口(無論如何,它是父級的)。

讓我詳細說明一個例子。這裏是一個模式:

public class AModel 
{ 
    public IEnumerable<SelectListItem> places { get; set; } 
    public int SelectedValue { get; set; } 
} 

這是一個索引操作方法:

public ActionResult Index() 
{ 
    ViewBag.Message = "Welcome to ASP.NET MVC!"; 

    AModel model = new AModel{ places = GetItems(), SelectedValue = 0 }; 

    return View(model); 
} 

,這是你的新方法GetItems:

public IEnumerable<SelectListItem> GetItems() 
{ 
    List<SelectListItem> list = new List<SelectListItem>(); 

    list.Add(new SelectListItem { Text = "Ptuj", Value = "1" }); 
    list.Add(new SelectListItem { Text = "Celje", Value = "2" }); 
    list.Add(new SelectListItem { Text = "Laško", Value = "3" }); 
    list.Add(new SelectListItem { Text = "Maribor", Value = "4" }); 
    list.Add(new SelectListItem { Text = "Ljubljana", Value = "5" }); 
    list.Add(new SelectListItem { Text = "N/A", Value = "6" }); 

    SelectList thelist = new SelectList(list, "Value", "Text"); 

    return thelist; 
} 

看你如何與去。

編輯(添加視圖)

@model AModel 

    @{ 
     ViewBag.Title = "Index"; 
    } 

    <h2>Example</h2> 

    Here are the places: @Html.DropDownListFor(m => m.SelectedValue, (SelectList)Model.Places, "Select a place") 
+0

View中的代碼如何看起來像?顯示DropDownlist。 – cvenko 2013-04-07 20:46:10

+0

@cvenko我編輯了我的回答,以包含剃鬚刀視圖,該視圖應該被稱爲Index.cshtml,並放置在解決方案中的Views文件夾內名爲Home的文件夾內。我還將SelectedValue更改爲0,以顯示默認文本。 – onefootswill 2013-04-08 00:12:54

0

看起來你正在呼籲在視圖中的視圖模型/模型GetItems方法。獲取物品。不好了 !不要這樣做。

將collection屬性添加到您的viewmodel的下拉列表中。 Viewmodel只是POCO。沒有任何方法。

public class SignUpVM 
{ 
    public string Name{ set;get;} 
    public List<SelectListItem> Cities{ set;get;} 
    public int PlaceOfBirth {set;get;} 
} 

現在,在您GET操作方法,創建這個視圖模型的對象,並填寫Cities集合屬性並返回到視圖。

public ActionResult Create() 
{ 
var vm=new SignUpVM(); 
vm.Cities=GetCities(); 
return View(vm); 
} 

假設GetCities方法返回SelectListItem用於城市列表。

public List<SelectListItem> GetCities() 
{ 
    List<SelectListItem> cityList=new List<SelectListItem>(); 
    cityList.Add(new SelectListItem { Text = "Ptuj", Value = "1" }); 
    cityList.Add(new SelectListItem { Text = "Celje", Value = "2" }); 
    return cityList; 
} 

現在,在我們看來,當你提交你會得到所選項目的ID在PlaceOfBirth財產的形式是強類型到SignUpVM

@model SignUpVM 
@using(Html.BeginForm()) 
{ 
    @Html.DropDownListFor(x=>x.PlaceOfBirth, 
          new SelectList(Model.Cities,"Value","Text"),"select") 
    <input type="submit" /> 
} 

[HttpPost] 
public ActionResult Create(SignUpVM model) 
{ 
    int placeOfBirthId=model.PlaceOfBirth; 
    // TO DO : Save and redirect. 
} 
+0

我仍然在同一行中得到null異常。難道是因爲在運行應用程序時首先顯示「索引」頁面?因爲我認爲,列表是空的,直到我點擊提交。如果我在項目屬性中將第一頁更改爲「信息」,則會出現404錯誤。 – cvenko 2013-04-07 11:56:26

+0

你在GET操作方法或POST中看到錯誤嗎?是下拉呈現一些項目? – Shyju 2013-04-07 13:34:12

+0

@ cvenko在我的表單標記中存在拼寫錯誤,我對其進行了更正。嘗試更新的答案。 – Shyju 2013-04-07 13:54:10