/ / Dump bei Verwendung von Dropdown zum Erstellen oder Bearbeiten von Operationen - HTML, asp.net, asp.net-mvc, asp.net-mvc-4, Rasiermesser

Dump bei Verwendung von Dropdown zum Erstellen oder Bearbeiten von Operationen - HTML, asp.net, asp.net-mvc, asp.net-mvc-4, Rasiermesser

Ich habe diese sehr einfache MVC erstellt / generiertProgramm (1 Minute) sind die Schritte 1. Erstellen Sie das MVC5-Asp-Programm und erstellen Sie eine neue Modellklasse - das Testmodell 2. Gehen Sie zum Controller add -> scaffold und geben Sie das Modell und die Kontextklasse an.

Die Rohoperation wurde erzeugt und allesfunktioniert gut Was ich jetzt möchte, ist, dass, wenn der Benutzer auf "Erstellen in dem Geschlecht" klickt, er eine Dropdown-Liste hat, die er auswählen kann, ich diesen Code schreibe, den ich aus dem vorherigen Beitrag habe, und ich habe einen Dump in der HTML-Dropdown-Liste, was bin ich fehlt hier?

das Model

using System.Collections.Generic;
using System.Data.Entity;
using System.Web.Mvc;

namespace TestropDownCreate.Models
{
public class TestModel
{
public int ID { get; set; }
public string Name { get; set; }

public string SelectedGender { get; set; }

public IEnumerable<SelectListItem> Gender
{
get
{
return new[]
{
new SelectListItem {Value = "M", Text = "Male"},
new SelectListItem {Value = "F", Text = "Female"}
};
}
}
}

public class TestModelDBContext : DbContext
{
public DbSet<TestModel> TestModel { get; set; }
}



}

In der vom Gerüst generierten Ansicht können Sie sehen, dass ich den generierten Code kommentiere und den setze @ Html.DropDownListFür was den Dump verursachen, wie soll ich ihn lösen.

@model TestropDownCreate.Models.TestModel

@{
ViewBag.Title = "Create";
}

<h2>Create</h2>


@using (Html.BeginForm())
{
@Html.AntiForgeryToken()

<div class="form-horizontal">
<h4>TestModel</h4>
<hr />
@Html.ValidationSummary(true)

<div class="form-group">
@Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
</div>

<div class="form-group">
@Html.LabelFor(model => model.SelectedGender, new { @class = "control-label col-md-2" })
<div class="col-md-10">

@Html.DropDownListFor(model => model.SelectedGender, Model.Gender)
@*@Html.EditorFor(model => model.SelectedGender)
@Html.ValidationMessageFor(model => model.SelectedGender)*@
</div>
</div>

<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}

<div>
@Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}

Antworten:

0 für die Antwort № 1

Ich würde einen kühnen Vorschlag machen, der auf der Erfahrung basiert, dass Sie einen bekommen ArgumentNullException Ausnahme, weil der Wert von SelectedGender wurde nicht eingestellt. Also, was passiert ist, dass hier ...

@Html.DropDownListFor(model => model.SelectedGender, Model.Gender)

asp.net versucht, die Dropdown-Liste mit einem bestimmten Wert vorzuwählen, und dazu wird der Wert von angezeigt SelectedGender und versucht, es mit einem der in angegebenen Werte abzugleichen GenderEs ist jedoch nichts festgelegt SelectedGender weil es null ist. Um dieses Problem zu beheben, können Sie zwei Ansätze verfolgen:

  1. initialisieren SelectedGender mit einem Standardwert, der einem der in angegebenen Werte entspricht Gender... entweder M oder F.

  2. Initialisieren SelectedGender mit einem Dummy-Standardwert wie einer leeren Zeichenfolge, fügen Sie dann einen Standardwert hinzu Gender wie nachstehend...

    public IEnumerable<SelectListItem> Gender
    {
    get
    {
    return new[]
    {
    new SelectListItem {Value = "", Text = "--Select a gender--"},
    new SelectListItem {Value = "M", Text = "Male"},
    new SelectListItem {Value = "F", Text = "Female"}
    };
    }
    }
    

Ein Vorschlag, auf den Jhoon in einem Kommentar hingewiesen hat, dass Sie die Geschlechterwerte nicht wirklich in der Datenbank behalten müssen, aber ich verstehe, dass dies nicht im Rahmen Ihrer Frage liegt