2014-02-10 4 views
0

Я пытаюсь получить раскрывающийся список, чтобы работать, но он не работает для меня. Это приложение, в основном, основано на фестивале, где вы можете добавить фестиваль вместе со своими мероприятиями. Ошибка я получаю на линии:Выпадающий список MVC 4 error

@Html.DropDownList("towns", (IEnumerable<SelectListItem>)ViewData["Town"], new{@class = "form-control", @style="width:250px" }) 

Это ошибка, я получаю:

Там нет ViewData элемента типа «IEnumerable», который имеет ключ »город.

Create.cshtml

<div class="form-group"> 
@Html.LabelFor(model => model.FestivalTown, new { @class = "control-label col-md-2" })  
<div class="col-md-10"> 
@Html.DropDownList("towns", (IEnumerable<SelectListItem>)ViewData["Town"], new{@class = "form-control", @style="width:250px" }) 
@Html.ValidationMessageFor(model => model.FestivalTown) 
</div> 
@*@Html.Partial("ddlFestivalCounty");*@ 
</div> 

Controller.cshtml

//Get 
List<SelectListItem> Towns = new List<SelectListItem>(); 
Towns.Add(new SelectListItem { Text = "Please select your Town", Value = "SelectTown" }); 
var towns = (from t in db.Towns select t).ToArray(); 
for (int i = 0; i < towns.Length; i++) 
{ 
Towns.Add(new SelectListItem 
{ 
Text = towns[i].Name, 
Value = towns[i].Name.ToString(), 
Selected = (towns[i].ID == 0) 
}); 
} 

ViewData["Town"] = Towns; 

//Post 
festival.FestivalTown.Town = collection["Town"]; 

Model.cs

public class Festival 
{ 
    public int FestivalId { get; set; } 

    [Required] 
    [Display(Name = "Festival Name"), StringLength(100)] 
    public string FestivalName { get; set; } 

    [Required] 
    [Display(Name = "Start Date"), DataType(DataType.Date)] 
    public DateTime StartDate { get; set; } 

    [Required] 
    [Display(Name = "End Date"), DataType(DataType.Date)] 
    public DateTime EndDate { get; set; } 

    [Required] 
    [Display(Name = "County")] 
    public virtual County FestivalCounty { get; set; } 

    [Display(Name = "Festival Location")] 
    public DbGeography Location { get; set; } 

    [Required] 
    [Display(Name = "Town")] 
    public virtual Town FestivalTown { get; set; } 

    [Required] 
    [Display(Name = "Festival Type")] 
    public virtual FestivalType FType { get; set; } 

    public UserProfile UserId { get; set; } 
} 

    public class Town 
{ 
    public int ID { get; set; } 
    [Display(Name = "Town")] 
    public string Name { get; set; } 
} 

ответ

1

Я подозреваю, что эта ошибка возникает при отправке формы на [HttpPost] действия и а не когда вы оказываете форму, верно? И это действие отображает ту же точку зрения, что и выпадающий список, не так ли? И внутри этого действия [HttpPost] вы забыли заполнить значение ViewData["Town"] так же, как в действии HttpGet, не так ли?

Итак, перейдите и заполните это свойство так же, как и в действии GET. Когда вы отправляете форму в свое действие [HttpPost], только выбранное значение отправляется на контроллер. Поэтому вам нужно повторно заполнить значения коллекции, если вы намерены повторно отобразить один и тот же вид, потому что это представление отображает выпадающее меню, которое пытается привязать его значения от ViewData["Town"].

И вот что я имею в виду с точки зрения кода:

[HttpPost] 
public ActionResult SomeAction(Festival model) 
{ 
    ... bla bla bla 

    // don't forget to repopulate the ViewData["Town"] value the same way you did in your GET action 
    // if you intend to redisplay the same view, otherwise the dropdown has no way of getting 
    // its values 
    ViewData["Town"] = ... same stuff as in your GET action 

    return View(model); 
} 

И все это, как говорится, я бы более настоятельно рекомендуем вам просмотреть с помощью моделей вместо этого ViewData/ViewBag слабо типизированных материал. Мало того, что ваш код станет намного чище, но даже сообщения об ошибках начнут иметь смысл.

+0

Ну ладно, я понимаю, спасибо. Легко ли получить его в режиме просмотра? Я только начинаю понимать mvc. – PatrickMelia

+0

Я пробовал это, и теперь у меня есть ошибка с выпадающим списком, в коде позади. Строка 195: Линия 195: festival.FestivalTown.Name = fcFestival ["Town"]; Что такое pproblem с этим? – PatrickMelia

Смежные вопросы