2014-10-11 3 views
0

Я новичок в первичных миграциях кода EntityFramework и изо всех сил стараюсь увидеть, как лучше всего получать раскрывающиеся списки, работающие в моем приложении. Сначала я использую рабочую БД, и я бы поставил TitleId в моей модели просмотра вместе со списком и связал выпадающее меню таким образом.как лучше всего получить выпадающие списки, работающие в моем приложении

Я пытался следовать предложенному ответу в следующем проблем качества

Best Practices for Lookup Tables in EF Code-First

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

Может кто-нибудь дать немного руководства, пожалуйста?

Модель

public class CandidateProfile 
{ 
    public ApplicationUser User { get; set; } 
    public Title Title { get; set; } 
    public string FirstName {get;set;} 
} 

ViewModel

public class PersonalInformationViewModel 
{ 
    [Required] 
    [UIHint("TitlePicker")] 
    public Title Title {get;set;} 
    public string FirstName {get;set;} 
} 

Контроллер

public ActionResult RenderHomepage() 
{ 
    var viewModel = new PersonalInformationViewModel(); 

    ApplicationDbContext context = new ApplicationDbContext(); 
    ViewBag.Titles = context.Titles.ToList(); 
    return PartialView("~/Views/Profile/_PersonalInformation.cshtml", viewModel); 
} 

public ActionResult SubmitPersonalDetails(PersonalInformationViewModel viewModel) 
{ 
    //... 
} 

Посмотреть

@Html.EditorFor(m => m.Title) 

Просмотров/Shared/EditorTemplates

@using Temps.Models 
@inherits System.Web.Mvc.WebViewPage<Title> 

@Html.DropDownListFor(m => m, new SelectList((IEnumerable<Title>)ViewBag.Titles, 
    "Id", 
    "Text", 
    Model == null ? 1 : Model.Id), 
    "-- please select --", 
    new { @class = "form-control" }) 

ответ

2

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

@Html.DropDownListFor(m => m.Title, Model.Titles, "--Please Select--", new { @class = "form-control" } 

первое выражение labda является то, что связывает выбранное значение в раскрывающемся списке для вашей модели

+0

Спасибо, Мэтт, это то, что я нашел, не знаю, почему эта статья лучше всего предложила ViewBag – Burt

1

Title представляет собой сложный объект, но <select> контролирует только отправлять обратно отдельные значения (или массивов в случае множественных выборок), поэтому он не может быть связан. В вашем случае значение, отправленное обратно с <select>, является ID выбранных Title. DefaultModelBinder пытается установить значение Title (скажем) 1, который не работает, поэтому Title имеет значение null.

Изменить просматривать модель для

public class PersonalInformationViewModel 
{ 
    [Required] 
    public int? Title {get;set;} 
    public string FirstName {get;set;} 
    public SelectList TitleList { get; set; } 
} 

Поскольку вы уже используете модель представления, его лучше включить SelectList здесь, а не с помощью ViewBag. Тогда в контроллере

public ActionResult RenderHomepage() 
{ 
    var viewModel = new PersonalInformationViewModel(); 
    ApplicationDbContext context = new ApplicationDbContext(); 
    model.TitleList = new SelectList(context.Titles, "ID", "Text") 
    return PartialView("~/Views/Profile/_PersonalInformation.cshtml", viewModel); 
} 

и в представлении

@Html.DropDownListFor(m => m.Title, Model.TitleList, "--Please Select--", new { @class = "form-control" } 

Примечание это кажется ненужным использовать EditorTemplate для этого, и в любом случае Model == null ? 1 : Model.Id), не имеет никакого смысла.Если значение Title равно null, в раскрывающемся списке будет отображаться --Please Select--. Если он установлен (скажем) 1, тогда будет выбран <option> с value="1".

На обратной стороне значения Title будет ID выбранного заголовка.

+0

Это в значительной степени мои мысли, а также Стивен. Я пойду с вашим предложением, что для меня не имеет смысла, как я сопоставляю выбранный идентификатор с фактической моделью? Один из них - это другой объект? Мне нужно сделать выбор, чтобы получить этот объект из контекста? – Burt

+0

@Burt, На обратной стороне, просто верните «Название» из базы данных на основе выбранного идентификатора –

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