2013-03-19 2 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 

Но, как указано в коде, это возвращается с нулевым исключением ссылки.

Мудрые волшебники, найдите момент, чтобы поделиться своей мудростью со мной о том, как наилучшим образом подойти к этой проблеме.

Большое спасибо. Мастер-ученик.

EDIT: это фактическая ошибка:

Object reference not set to an instance of an object. 

и это модель с точки зрения

@model HouseGaurd.Models.DropList 

Может ли это быть причиной проблемы?

+0

Проблема в том, что вы отправляете значение, называемое '' product '', поэтому свойство' LettingList' на вашей модели не может быть создано экземпляром модели. Если вам просто нужно получить выбранное значение, следуйте советам в ответе, который вам дал. Если вы пытаетесь создать экземпляр своего LettingList, вам нужно будет его снова создать. –

ответ

1

Создать свойство в модели для проведения выпадающего значения, например:

public int EstateAgentID {get;set;} 

и изменение в DropDownList к DropDownListFor. Мол,

@Html.DropDownListFor(model=>model.EstateAgentID , Model.LettingList) 

в методе lettingselect сделать:

var agent = viewModel.EstateAgentID ; 

Edit:: Вы также можете получить выпадающее значение, используя имя вашего выпадающего списка.Для этого сделать следующее:

Измените метод

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

Здесь продукт является выбранный товар

+0

@ Html.DropDownList ** Для ** (model => model.EstateAgentID, Model.LettingList) – maxs87

+0

Это заклинание отлично работает! Спасибо за вашу мудрость. Бьюсь об заклад, вы носите шляпу волшебников, которая БОЛЬШАЯ, а затем Гэндальф! В очередной раз благодарим за помощь. – Jay

+0

Помните, что 'DropList' по-прежнему будет пустым, если вы не измените представление. –

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) 

вы можете получить доступ к раскрывающемуся выбранному значению в контроллере. Надеюсь, это поможет вам.