Probleme mit ASP MVC + Html.DropDownList () mit einem Muster unter Verwendung von Modelview

StackOverflow https://stackoverflow.com/questions/1047899

Frage

Vor kurzem gab ich eine Frage zu den HTML-Helfer und Dropdownlist habe es funktioniert ( hier ). Aber jetzt habe ich beschlossen, es war viel klüger Modelview Patterns zu wechseln, damit ich Zugang haben zu stark Methoden typisiert in meinen Ansichten etc. Was ich tat, war ich mit dem Code einige Anpassungen gemacht in meinem anderen Thema in der folgenden Art und Weise:

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

Und meine Create.aspx Ansicht (ein Teil davon):

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

Zur Führung ich verwendet habe, die NerdDinner Tutorial von ScottGu und ich habe verschiedene Themen lesen Sie hier.

Meine Frage ist, ob es möglich ist, meine careerlevel MVC ASP setzen zu lassen, educationlevel und branche (Dropdownlists) automatisch, wie es zur Zeit eine ID-String zurückgibt, das ist nicht das, was ich will. Als ich die Schaffung des Select ändern:

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

Also ohne die „ID“ und „Namen“ es nicht entweder speichern (ich denke, es ist immer noch als String in der post-Methode zurückgegeben wird, und nicht das Objekt selbst) und neben diesem, listet es in der Ansicht als :. vacature.EducationLevels etc. Also nicht die Namen, aber das Objekt selbst aufgeführt ist

Letzte Frage Also, kurz gesagt, meine Frage ist, ob es möglich ist, diesen Ansatz zu verwenden, um meine branche, educationallevel und careerlevel gesetzt. Also nicht automatisch?

In diesem Fall muss ich noch Dinge verwenden wie:

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

In meinem Controller? Oder gibt es andere, weichere Optionen.

War es hilfreich?

Lösung

Edited Guid zu verwenden:

Mit Dropdownlists verwende ich einen etwas anderen Ansatz. Es könnte möglich sein, Ihr Ansichtsmodell zum Laufen zu bringen, aber für mich ist es einfacher, auf diese Weise:

public class VacaturesFormViewModel
{

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

}

Die EducationLevelID wird die ausgewählte ID Ihres Dropdown haben. Dies ist die Ansicht:

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

Controller

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

Andere Tipps

Ich bin mir nicht sicher, aber ich denke, Sie sollten Modell Bindemittel erstellen. ( David Hayden schrieb ein einfaches Modell Binder)

Sie könnten binden educationID Parameter automatisch:

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

    if (educationID != null)
    {
        vacatureToAdd.EducationLevels = 
            repository.GetEducationLevelByID(educationID.Value);
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top