Question

Récemment, j'ai posé une question à propos de la liste déroulante des aides html et je l'ai fait fonctionner (). Mais maintenant, j'ai décidé qu'il était beaucoup plus intelligent de passer à ModelView Patterns. J'ai donc accès à des méthodes fortement typées, etc. Ce que j'ai fait, c'est que j'ai apporté quelques modifications au code de mon autre sujet de la manière suivante:

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();
            }
        }
    }

Et ma vue Create.aspx (en partie):

<% 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>
<% } %>

À titre indicatif, j’ai utilisé le NerdDinner tutoriel par ScottGu et j'ai lu divers sujets ici.

Ma question est de savoir s’il est possible de laisser MVC ASP définir automatiquement mon niveau de carrière, mon niveau d’éducation et ma liste (listes déroulantes), car il renvoie actuellement une chaîne d’identification qui n’est pas ce que je veux. Lorsque je modifie la création de SelectList en:

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

Donc sans " ID " et " Nom " il n'enregistre pas non plus (il est toujours renvoyé sous forme de chaîne dans la méthode post, et non pas l'objet lui-même) et à côté de cela, il est répertorié dans la vue comme suit: vacature.EducationLevels etc. Ainsi, pas les noms, mais l'objet. lui-même est répertorié.

Dernière question En bref, ma question est de savoir s’il est possible d’utiliser cette approche pour définir ma branche, mon niveau d’enseignement et mon niveau de carrière. Donc pas automatiquement?

Dans ce cas, je dois encore utiliser des éléments tels que:

[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);
        }

Dans mon contrôleur? Ou existe-t-il d’autres options plus fluides?

Était-ce utile?

La solution

Modifié pour utiliser Guid:

Avec les listes déroulantes, j'utilise une approche légèrement différente. Il est peut-être possible de faire fonctionner votre modèle de vue, mais pour moi, il est plus facile de cette façon:

public class VacaturesFormViewModel
{

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

}

EducationLevelID aura l'identifiant sélectionné dans votre liste déroulante. Voici la vue:

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

Contrôleur

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

Autres conseils

Je ne suis pas sûr mais je pense que vous devriez créer des classeurs. ( David Hayden a écrit un classeur de modèle simple.)

Vous pouvez lier le paramètre educationID automatiquement:

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

    if (educationID != null)
    {
        vacatureToAdd.EducationLevels = 
            repository.GetEducationLevelByID(educationID.Value);
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top