Недавно я разместил вопрос о раскрывающемся списке 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);
}
В мой контроллер? Или есть другие, более плавные варианты.
Проблема в том, что я что мой EducationLevelID не является int (как поддерживается dropdownlist?), Но GUID, который не поддерживается сразу. Насколько мне известно, вы должны сгенерировать GUID из возврата выпадающего списка. Это означает, что я все еще должен делать шаги, которые я делал раньше. – bastijn
Я проверил, и Guid не является проблемой. Редактированный код использует IEnumerable, но не должно быть никакого различия с SelectList –
, так, как выпадающий список с помощью 'EducationLevelID' должен отображать выбранный элемент соответствующим образом? – Remus