2013-03-19 97 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) 

您可以在控制器访问下拉列表中选择值。我希望这会对你有帮助。