problemas con ASP MVC + Html.DropDownList () usando un patrón ModelView
-
20-08-2019 - |
Pregunta
Recientemente publiqué una pregunta sobre la lista desplegable de ayuda html y la puse a funcionar ( aquí ). Pero ahora he decidido que era mucho más inteligente cambiar a Patrones de ModelView, así que tengo acceso a métodos fuertemente tipados en mis vistas, etc. Lo que hice fue hacer algunos ajustes al código en mi otro tema de la siguiente manera:
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();
}
}
}
Y mi vista Create.aspx (parte de ella):
<% 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>
<% } %>
Para guiar he usado el NerdDinner tutorial de ScottGu y he leído varios temas aquí.
Mi pregunta es si es posible dejar que MVC ASP establezca mi nivel de carrera, nivel educativo y branche (listas desplegables) automáticamente, ya que actualmente está devolviendo una cadena de identificación que no es lo que quiero. Cuando cambio la creación de la SelectList a:
this.CareerLevels = new SelectList(repository.GetAllCareerLevels(), vacature.CareerLevels);
Entonces, sin la " ID " y " Nombre " tampoco se guarda (supongo que todavía se devuelve como una cadena en el método de publicación, y no el objeto en sí) y al lado de esto, aparece en la vista como: vacature.EducationLevels, etc. Así que no los nombres sino el objeto en sí está en la lista.
Pregunta final En resumen, mi pregunta es si es posible utilizar este enfoque para establecer mi nivel de sucursal, nivel educativo y nivel profesional. Entonces, ¿no automáticamente?
En cuyo caso todavía tengo que usar cosas como:
[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);
}
¿En mi controlador? ¿O hay otras opciones más suaves?
Solución
Editado para usar Guid:
Con las listas desplegables, uso un enfoque ligeramente diferente. Es posible que su modelo de vista funcione, pero para mí es más fácil de esta manera:
public class VacaturesFormViewModel
{
public IEnumerable<SelectListItem>EducationLevels{ get; set; }
public Guid EducationLevelID{ get; set; }
}
El EducationLevelID tendrá la identificación seleccionada de su menú desplegable. Esta es la vista:
<%= Html.DropDownList("EducationLevelID", Model.EducationLevels)%>
Controlador
IEnumerable<SelectListItem> educationLevelList =
from level in GetLevelList()
select new SelectListItem
{
Text = level .Name,
Value = level.Uid.ToString()
};
model.EducationLevels = educationLevelList ;
Otros consejos
No estoy seguro, pero creo que debería crear carpetas de modelos. ( David Hayden escribió una carpeta de modelo simple)
Puede enlazar el parámetro educationID automáticamente:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Guid? educationID, FormCollection form)
{
Vacatures vacatureToAdd = new Vacatures();
if (educationID != null)
{
vacatureToAdd.EducationLevels =
repository.GetEducationLevelByID(educationID.Value);
}