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?

¿Fue útil?

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);
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top