2009-06-26 1 views
0

Недавно я разместил вопрос о раскрывающемся списке html helper и получил его работу (here). Но теперь я решил, что было намного умнее переключаться на шаблоны ModelView, поэтому у меня есть доступ к строго типизированным методам в моих представлениях и т. Д. Я сделал некоторые изменения кода в моей другой теме следующим образом:проблемы с ASP MVC + Html.DropDownList() с использованием шаблона ModelView

VacatureFormViewModel:

public class VacaturesFormViewModel 
{ 
    public Vacatures Vacature { get; private set; } 
    public SelectList EducationLevels { get; private set; } 
    public SelectList Branches { get; private set; } 
    public SelectList CareerLevels { get; private set; } 

    Repository repository; 

    // Constructor 
    public VacaturesFormViewModel(Vacatures vacature) 
    { 
     this.Vacature = vacature; 
     this.repository = new Repository(); 
     this.EducationLevels = new SelectList(repository.GetAllEducationLevels(),"ID","Name",vacature.EducationLevels); 
     this.Branches = new SelectList(repository.GetAllBranches(),"ID","Name",vacature.Branches); 
     this.CareerLevels = new SelectList(repository.GetAllCareerLevels(), "ID", "Name", vacature.CareerLevels); 

    } 
} 

BanenController:

// 
    // GET: /Banen/Create 

    public ActionResult Create() 
    { 
     Vacatures vacature = new Vacatures(); 
     return View(new VacaturesFormViewModel(vacature)); 
    } 

    // 
    // POST: /Banen/Create 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(Vacatures vacatureToAdd) 
    { 
     if (ModelState.IsValid) 
     { 
      try 
      { 
       // TODO: Add insert logic here 
       repository.AddToVacatures(vacatureToAdd); 
       repository.SaveChanges(); 

       // Return to listing page if succesful 
       return RedirectToAction("Index"); 
      } 
      catch (Exception e) 
      { 
       return View(); 
      } 
     } 
    } 

И мой взгляд Create.aspx (часть):

<% using (Html.BeginForm()) {%> 

    <fieldset> 
     <legend>Fields</legend> 
     <p> 
      <label for="Title">Title:</label> 
      <%= Html.TextBox("Title", Model.Vacature.Title) %> 
      <%= Html.ValidationMessage("Title", "*") %> 
     </p> 
     <p> 
      <label for="Content">Content:</label> 
      <%= Html.TextArea("Content", Model.Vacature.Content) %> 
      <%= Html.ValidationMessage("Content", "*") %> 
     </p> 
     <p> 
      <label for="EducationLevels">EducationLevels:</label> 
      <%= Html.DropDownList("EducationLevels", Model.EducationLevels)%> 
      <%= Html.ValidationMessage("EducationLevels", "*") %> 
     </p> 
     <p> 
      <label for="CareerLevels">CareerLevels:</label> 
      <%= Html.DropDownList("CareerLevels", Model.CareerLevels)%> 
      <%= Html.ValidationMessage("CareerLevels", "*")%> 
     </p> 
     <p> 
      <label for="Branches">Branches:</label> 
      <%= Html.DropDownList("Branches", Model.Branches)%> 
      <%= Html.ValidationMessage("Branches", "*")%> 
     </p> 
     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 
<% } %> 

Для руководства Я использовал учебное пособие NerdDinner от ScottGu, и здесь я читал различные темы.

Вопрос в том, можно ли MVC ASP автоматически установить уровень карьеры, уровень образования и разветвления (dropdownlists), поскольку в настоящее время он возвращает строку идентификатора, которая не является тем, что я хочу. Когда я изменяю создание SelectList к:

this.CareerLevels = new SelectList(repository.GetAllCareerLevels(), vacature.CareerLevels); 

Так без «ID» и «Имя» это не спасает ни (я предполагаю, что это все еще возвращается как строка в методе пост, а не объект), а рядом с ним он отображается в виде как: vacature.EducationLevels и т. д. Таким образом, не перечислены имена, кроме самого объекта.

Заключительный вопрос Так, короче говоря, мой вопрос, если можно использовать этот подход, чтобы установить свой бранч, educationallevel и careerlevel. Так не автоматически?

В этом случае я все равно придется использовать такие вещи, как:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(FormCollection form) 
    { 
     Vacatures vacatureToAdd = new Vacatures(); 

     // Retrieve the education level by its ID 
     if (!form["EducationLevels"].Equals("")) 
     { 
      Guid educationID = new Guid(form["EducationLevels"]); 
      vacatureToAdd.EducationLevels = repository.GetEducationLevelByID(educationID); 
     } 

В мой контроллер? Или есть другие, более плавные варианты.

ответ

2

Edited использовать Guid:

С DropDownLists я использую несколько иной подход. Это можно было бы получить ViewModel работу, но для меня это проще так:

public class VacaturesFormViewModel 
{ 

    public IEnumerable<SelectListItem>EducationLevels{ get; set; } 
    public Guid EducationLevelID{ get; set; } 

} 

EducationLevelID будет иметь выбранный идентификатор вашего списка. Это мнение:

<%= Html.DropDownList("EducationLevelID", Model.EducationLevels)%> 

Контроллер

IEnumerable<SelectListItem> educationLevelList = 
          from level in GetLevelList() 
          select new SelectListItem 
          { 
           Text = level .Name, 
           Value = level.Uid.ToString() 
          }; 
    model.EducationLevels = educationLevelList ; 
+0

Проблема в том, что я что мой EducationLevelID не является int (как поддерживается dropdownlist?), Но GUID, который не поддерживается сразу. Насколько мне известно, вы должны сгенерировать GUID из возврата выпадающего списка. Это означает, что я все еще должен делать шаги, которые я делал раньше. – bastijn

+1

Я проверил, и Guid не является проблемой. Редактированный код использует IEnumerable , но не должно быть никакого различия с SelectList –

+0

, так, как выпадающий список с помощью 'EducationLevelID' должен отображать выбранный элемент соответствующим образом? – Remus

1

Я не уверен, но я думаю, вы должны создать привязку к модели. (David Hayden написал простую модель связующий)

+0

Это также пример только строки на основе информации. Поскольку он использует: HttpContext.Request.Форма [ "Name"]; Это именно то, что пойдет не так в моем случае, это не дает объект, который я думаю, а скорее строку. Не уверен, хотя. – bastijn

+0

С другой стороны, это может фактически работать как: > Blockquote «Вы можете создать свои собственные настраиваемые привязки модели для клиентов, которые создают экземпляр нового экземпляра клиента и добавляет соответствующие значения форм в различные свойства клиента» звучит многообещающе. – bastijn

1

Вы можете связать educationID параметр автоматически:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Guid? educationID, FormCollection form) 
{ 
    Vacatures vacatureToAdd = new Vacatures(); 

    if (educationID != null) 
    { 
     vacatureToAdd.EducationLevels = 
      repository.GetEducationLevelByID(educationID.Value); 
    } 
Смежные вопросы