2013-09-08 3 views
1

Этот вопрос должен быть очень простым. Я пытаюсь передать значения в моем раскрывающемся списке на мой взгляд контроллеру. Я не получаю ошибок, но он отправляет нулевое значение для этого имущества. Пожалуйста, помогите ..Выпадающий список Значение, не переданное контроллеру

Мой код выглядит следующим образом:

Контроллер:

public ActionResult Create() 
    { 
     var list = new [] 

      { 
       new Room{ RoomID = 1, Building = "FAYARD HALL"}, 
       new Room{ RoomID = 2, Building = "WHATEVER HALL"}, 
       new Room{ RoomID = 3, Building = "TIME SQUARE"}, 
       new Room{ RoomID = 4, Building = "MISSISSIPPI"}, 
       new Room{ RoomID = 5, Building = "NEW YORK"}, 

      }; 


     var selectList = new SelectList(list,"RoomID", "Building"); 
     ViewData["BuildingList"] = selectList; 

     return View(); 
    } 

    // 
    // POST: /Room/Create 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(Room room) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Rooms.Add(room); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(room); 
    } 

МОЙ ВЗГЛЯД:

<div> 
     @Html.LabelFor(model => model.Building, "Building") 
    </div> 
    <div> 

     @Html.DropDownList("BuildingList", String.Empty) 
     @Html.ValidationMessageFor(model => model.Building) 
    </div> 

Пожалуйста, помогите ...

Спасибо.

ответ

4

Является ли ваша капля вниз населенной? Учитывая ваш код, мне кажется, вам нужно следующее:

@Html.DropDownListFor(model => model.Building, ViewData["BuildingList"]) 

ie. привяжите выбранное значение к свойству Building вашего Room и используйте раскрывающийся список из вашей модели просмотра, чтобы заполнить список.

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

Редактировать

Ok Я собираюсь сделать вещи намного проще для вас.

Я начну с занятий. Вот номер я предполагаю, что вы работаете с:

public class Room 
{ 
    public int RoomId { get; set; } 
    public string Building { get; set; } 
} 

Теперь давайте делать что-то немного лучше, чем при использовании ViewData. Я создал для вас модель представления. Вы заполняете это своим списком выбора, и элемент, который вы выберете в представлении, будет связан с SelectedRoomId при отправке формы.

public class ViewModel 
{ 
    public int SelectedRoomId { get; set; } 
    public SelectList RoomOptions { get; set; } 
} 

Контроллер

private SelectList GetSelectList() 
{ 
    var list = new[] 
    { 
     new Room { RoomId = 1, Building = "FAYARD HALL"}, 
     new Room { RoomId = 2, Building = "WHATEVER HALL"}, 
     new Room { RoomId = 3, Building = "TIME SQUARE"}, 
     new Room { RoomId = 4, Building = "MISSISSIPPI"}, 
     new Room { RoomId = 5, Building = "NEW YORK"} 
    }; 

    return new SelectList(list, "RoomId", "Building"); 
} 

public ActionResult Create() 
{ 
    ViewModel viewModel = new ViewModel 
    { 
     RoomOptions = GetSelectList() 
    }; 
    return View(viewModel); 
} 

[HttpPost] 
public ActionResult Create(ViewModel viewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     // Save here 
     // create a new room using the SelectedOptionId in the viewModel 
     return RedirectToAction("Index", "Home"); 
    } 
    // repopulate the list if something failed 
    viewModel.RoomOptions = GetSelectList(); 
    return View(viewModel); 
} 

Посмотреть

@model PathToYourViewModel.ViewModel 

@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(model => model.SelectedRoomId, Model.RoomOptions, "-- select an option --") 
    <button type="submit">Submit</button> 
}; 

Испытанный. Удачи!

+0

Список заполняется на мой взгляд, правильно .. Для некоторых причина, по которой он показывает значение NULL в методе создания HttpPost. Я создаю новый объект комнаты со значением здания.Спасибо за ваш ответ. – digiShadoe

+0

@digiShadoe - обновленный ответ! –

+0

Извините, что я был в отъезде на минуту .. Ваши идеи привели некоторые на сайт к моей проблеме .. Еще раз спасибо .... – digiShadoe

1

Скрепление модели происходит с помощью names property в mvc.

В вашем случае имя вашего контроля является BuildingList:

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

Поэтому на ваш контроллер действий будет идти следующим образом:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(FormCollection collection) 
{ 
    var selectedValue = collection["BuildingList"]; 
} 
Смежные вопросы