2013-03-19 98 views
1

我已經來到智慧巫師理事會這裏在Stackoverflow,因爲我需要一些魔法(它似乎)來解決我的代碼的一個小問題。從下拉列表中獲取一個值mvc 4

我試圖從我的下拉列表中接收數據,我嘗試了很多法術......但是我感覺我的能力太弱了。我試圖從下拉列表中檢索數據會導致我的電腦嘔吐一些。因此,我希望你們的智慧(即使是一個字)能幫助我想出正確的代碼來打敗這個問題。

這裏是我的代碼看起來像

的型號(型號不是很漂亮):

namespace HouseGaurd.Models 
{ 
    public class DropList 
    { 
     public SelectList LettingList { get; set; } 
    } 

控制器填補了列表:(這是HTTPGET)

public ActionResult lettingselect() 
    { 
     var model = _db.EstateAgents; 
     DropList rlist = new DropList(); 
     List<SelectListItem> listItems = new List<SelectListItem>(); 
     foreach (var item in model) 
     { 

      listItems.Add(new SelectListItem() 
      { 
       Value = item.estateAgentID.ToString(), 
       Text = item.CompanyName 
      }); 
     } 
     rlist.LettingList = new SelectList(listItems, "Value", "Text"); 
     return View(rlist); 
    } 

所以這填充名單,這是顯示的模型,到目前爲止一切工作正常,該咒語成立:

<h2>Select a </h2> 
@using (Html.BeginForm()) { 

@Html.DropDownList("product", Model.LettingList) 
    <p> 
     <input type="submit" value="select" /> 
    </p> 
} 

它使用相關信息填充下拉列表!

現在,當我點擊提交,我們回去POST控制器,這是在計算機啓動時拋出了起來:

[HttpPost] 
    public ActionResult lettingselect(DropList viewModel) 
    {   
     using (var context = new HouseDB()) 
     { 
      var agent = viewModel.LettingList.DataTextField; //null reference 
      var hID = context.HouseListers.Single(d=>d.user == User.Identity.Name); 
      var let = new Letting(); 
      let.approved = false; 
      let.user = User.Identity.Name; 
      let.lettingAgent = agent; 
      let.houseID = hID.houseID; 
      let.noProblemsRaised = 0; 

      context.Lettings.Add(let); 
      context.SaveChanges(); 
     } 
     return RedirectToAction("Complete"); 
    } 

我試圖讓所選擇的值改回,我嘗試使用:

var agent = viewModel.LettingList.DataTextField; //null reference 

但正如代碼中所述,這返回一個空引用異常。

明智的巫師,花點時間與我分享你的智慧,以便如何最好地解決這個問題。

非常感謝。 學徒嚮導。

編輯:這是實際的錯誤:

Object reference not set to an instance of an object. 

,這是在視圖

@model HouseGaurd.Models.DropList 

難道這是導致問題的模式?

+0

問題是您要回發一個名爲'product'的值,所以您的模型上的'LettingList'屬性不可能被模型綁定器實例化。如果您只需要獲取選定的值,請按照您提供的答案中的建議進行操作。 如果您試圖實例化您的LettingList,則需要重新構建它。 – 2013-03-19 12:20:11

回答

1

舉辦下拉值,例如,創建模型的特性:

public int EstateAgentID {get;set;} 

,改變你到下拉列表來DropDownListFor。像,

@Html.DropDownListFor(model=>model.EstateAgentID , Model.LettingList) 
在lettingselect方法

做:

var agent = viewModel.EstateAgentID ; 

編輯:: 您也可以使用下拉菜單的名稱下拉值。對於此執行以下操作:

你的方法更改爲

public ActionResult lettingselect(DropList viewModel,string product)//product is the name of your dropdown 

這裏產品是你選擇的項目

+0

@ Html.DropDownList **對於**(model => model.EstateAgentID,Model.LettingList) – maxs87 2013-03-19 12:16:49

+0

這個咒語非常完美!感謝您的智慧。我敢打賭,你穿的是一個比較大的巫師帽,然後是甘道夫!再次感謝你的幫助。 – Jay 2013-03-19 12:22:23

+0

請注意,如果您不更改視圖,DropList將仍爲空。 – 2013-03-19 12:22:25

1

型號:

public SelectList List{ get; set; } 

Conoroller:

public ActionResult lettingselect() 
{ 
    var model = _db.EstateAgents; 
    DropList rlist = new DropList(); 
    List<SelectListItem> listItems = new List<SelectListItem>(); 
    foreach (var item in model) 
    { 

     listItems.Add(new SelectListItem() 
     { 
      Value = item.estateAgentID.ToString(), 
      Text = item.CompanyName 
     }); 
    } 
    ViewData["List"] = listItems; 
    return View(rlist); 
} 

查看:

@Html.DropDownList("List", ViewData["List"] as SelectList) 

您可以在控制器訪問下拉列表中選擇值。我希望這會對你有幫助。