2013-09-10 6 views
0

В настоящее время у меня есть следующие объекты:
фильм:Entity отношения в DropdownListFor

public class Movie 
{ 

    public int ID { get; set; } 
    [Required] 
    public string Title { get; set; } 
    [DataType(DataType.Date)] 
    public DateTime ReleaseDate { get; set; } 
    [Required] 
    public string Genre { get; set; } 
    [DataType(DataType.Currency), Range(1,100)] 
    public decimal Price { get; set; } 
    [StringLength(5)] 
    public string Rating { get; set; } 
    [StringLength(200)] 
    public string comments { get; set; } 


    public Director director { get; set; } 
} 

Режиссер:

[Table("Director")] 
public class Director 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 
    [Required, MaxLength(50)] 
    [Display(Name = "Name")] 
    public string name { get; set; } 
    [Required, MaxLength(50)] 
    [Display(Name = "Last Name")] 
    public string lastName { get; set; } 
    [Required, Range(1,100)] 
    public int age { get; set; } 

    [NotMapped] 
    public string fullName { 
     get { return this.name + " " + this.lastName; } 
    } 
} 

Когда я получить доступ к форме редактирования, я загружаю SelectList из директоров в DB:

public ActionResult Edit(int id = 0) 
    { 
     Movie movie = db.Movies.Find(id); 
     if (movie == null) 
     { 
      return HttpNotFound(); 
     } 
     ViewBag.Directors = new SelectList(db.Directors.ToList(), "ID", "fullname"); 
     return View(movie); 
    } 

Затем я использую @ Html.DropDownListДля отображения поле со списком в форме:

<div class="editor-field"> 
     @Html.DropDownListFor(model => model.director, (SelectList)ViewBag.Directors, "Select") 
     @Html.ValidationMessageFor(model => model.director) 
    </div> 

Все вроде бы хорошо, но когда я выбираю вариант и попытаться сохранить форму, я получаю сообщение проверки о том, что «значение„1“недействителен». Где «1» - идентификатор директора.

Итак, определенно мне не хватает чего-то, чтобы напрямую связать директора.

+1

Ваш выпадающий список - это список идентификаторов, свойство вашего директора имеет тип 'Director'. У вас должно быть свойство 'DirectorID' где-то в этом классе' Movie'. – dom

+0

Нет ли способа сделать то же самое без добавления идентификатора DirectorID? –

+1

Для этого вам нужно будет создать настраиваемое связующее устройство. Или лучший способ создать ViewModel специально для формы, содержащей свойство DirectorId. – mxmissile

ответ

0

Если вы не whant изменить идентификатор по соглашению, чем вы можете немного изменить свой код, который создает SelectList:

var list = new List<SelectListItem>; 

var items = from n in db.Directors 
      select new SelectListItem 
      { 
       Text = n.fullname, 
       Value = n.ID 
      }; 
//*Add your items to List 
foreach (var item in items) 
    list.Add(item); 

ViewBag.Directors = list; 

Редакции: Не смотрите на мою первую часть. Комментаторы были правы. Ваши модели не подключены. Вам нужно directorID Недвижимость в вашей модели Movie, чтобы заставить ее работать. Чем вы должны изменить DropDownListFor как folows:

@Html.DropDownListFor(model => model.directorID, (SelectList)ViewBag.Directors, "Select") 
+0

Как это отличается от того, что он написал? Делает то же самое ИМО. – mxmissile

+0

@mxmissile Вы правы. Спасибо. Я не понял вопроса правильно. –

+0

Все, что я пытаюсь избежать, это добавить этот propertyIDID в мою Киномодель. –

0

Является ли ваша организация автогенерируемая, или вы сделали это ваша собственная личность. Если у вас есть автогенерация, похоже, что у вас нет отношений между режиссером и фильмом. Иначе ваш фильм будет иметь свойство DirectorID, а у объекта Directory будет ICollection of Movies. Далее, используя DropDownlistFor в фильмах для Директора, вы должны быть директоромIDID, и это будет правильный способ сделать это. т.е.

public class Movie 
{ 

public int ID { get; set; } 
[Required] 
public string Title { get; set; } 
[DataType(DataType.Date)] 
public DateTime ReleaseDate { get; set; } 
[Required] 
public string Genre { get; set; } 
[DataType(DataType.Currency), Range(1,100)] 
public decimal Price { get; set; } 
[StringLength(5)] 
public string Rating { get; set; } 
[StringLength(200)] 
public string comments { get; set; } 
//change here 
public int DirectorID {get; set;} 

public Director director { get; set; } 
} 

И выбрать список будет

<div class="editor-field"> 
    @Html.DropDownListFor(model => model.DirectorID, (SelectList)ViewBag.Directors, "Select") 
    @Html.ValidationMessageFor(model => model.DirectorID) 
</div> 

И заселить директоров вы можете создать список выбора по

var directors=db.Directors.Select(o=>new {ID=o.DirectorID, Name=o.DirectorName}); 

И Добавьте этот список выбора для viewbag как обычно ,

ViewBag.Directors = new SelectList(directors, "ID", "Name"); 
+0

С помощью этого решения свойство Director не заполняется при загрузке фильма. Поэтому я не могу сделать что-то вроде movie.director.name –

+0

, пожалуйста, посмотрите мое последнее изменение в ответе – serene

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