2017-01-10 18 views
0

Ich bin neu in MVC und C# und für ein Projekt Ich versuche, den Benutzer Städte aus einer Liste auswählen und später in der DB speichern. Ich habe ein paar Posts darüber gelesen, aber ich konnte nicht herausfinden, wie ich meine beheben sollte. Ich kann alle anderen Artikel meines Formulars speichern:So speichern Sie mehrere Auswahl/Dropdown-Liste in C#

@using (Html.BeginForm("AddProjectInfo", "Insert", FormMethod.Post, new { 
     enctype = "multipart/form-data" 
     @id = "insertform", @class = "form-horizontal col-md-4 col-md-offset-4" 
    })) 

aber für die Stadt speichert es nur das erste ausgewählte Element nicht alle. Kannst du mir bitte helfen, das zu beheben?

Hier ist meine Ansicht:

<div class="form-group"> 
     <label class="col-sm-3 col-form-label text-left">City * </label> 
     <div class="col-sm-9"> 
      @Html.DropDownList(
      "City", 
      new SelectListItem[] { 
        new SelectListItem { 
         Text = "Cambridge", Value = "Ca" 
        }, 
        new SelectListItem { 
         Text = "Oxford", Value = "Ox" 
        }, 
        new SelectListItem { 
         Text = "Sheffield", Value = "Sh" 
        }     
      }, 
     "--Select Cities--", 
    new { 
     @class = "form-control", 
     required = true, 
     multiple = "multiple" 
    } 
     ) 
    </div> 
</div> 

Hier ist mein Controller:

[HttpPost] 
    public ActionResult Insert(FormCollection frm) { 
     Models.ProjectInfo p = new Models.ProjectInfo(); 
     String[] Cities= frm.GetValues("City"); 
     p.ContractId = frm[ "ContractId" ]; 
     p.Year = Convert.ToDecimal(frm[ "Year" ]); 
     p.City = Cities.ToString(); 
     p.Location = frm[ "Location" ]; 
     // Insert into the Database 
      AddProjectInfo(p); 
      ViewBag.ResponseMessage = "Submitted !"; 

    } 

Ich weiß, wie zu tun, dass mit Hilfe von JavaScript, aber nicht wissen, wie C#, dass umgehen kann. Vielen Dank!

+0

public ActionResult Insert (FormCollection frm) Dies sollte ein echtes Modell mit Feldern sein, die den Eingaben in html entsprechen – Steve

+0

Verwenden Sie 'DropDownList()' nicht mit 'multiple' - verwenden Sie' ListBoxFor() '(siehe [diese Antwort] (http://stackoverflow.com/questions/40725358/why-does-the-dropdownlistfor-lose-the-multiple-selection-after-submit-but-the-li/40732481#40732481)). Und niemals 'FormCollection'. Erstellen Sie ein Ansichtsmodell und binden Sie es an eine Eigenschaft - beziehen Sie sich auf [diese Antwort] (http://stackoverflow.com/questions/37848223/listboxfor-not-letting-me-select-multiple-items-mvc/37848327#37848327) für eine typische Implementierung –

Antwort

0

Ich werde Ihnen sagen, im Voraus, dass ich diese Beispiele schrieb, ohne es zu testen, aber es ist nur Sie eine allgemeine Vorstellung davon zu geben, wie mit Drop-Down-Listen/Listenfelder, um fortzufahren richtig. Am Ende werde ich den Link zu meinem GitHub verlassen, wo ich ein einfaches Projekt habe, das ich vor einiger Zeit speziell für solche Fälle geschrieben habe.

Also, fangen wir an. Der Einfachheit halber würde ich die Dropdown-Liste lieber im Controller erstellen lassen. Zum Beispiel:

Nehmen wir an, Sie haben ein Modell:

public class Person 
{ 
    public string Name { get; set; } 
    public string Surname { get; set; } 
    public string City { get; set; } 

    [NotMapped] 
    public SelectList CitySelectList { get; set; } 
} 

Beachten Sie die CitySelectList, die NotMapped ist, da wir es nicht wollen, an die DB zu verbinden. Der Wert von CitySelectList wird in der DB durch City

gespeichert und dann haben Sie eine Aktion Methode:

public ActionResult Insert() 
{ 
    var person = new Person { CitySelectList = new SelectList(
    new List<SelectListItem> 
     { 
      new SelectListItem { Text = "Cambridge", Value = "Ca" }, 
      new SelectListItem { Text = "Oxford", Value = "Ox" }, 
      new SelectListItem { Text = "Sheffield", Value = "Sh" } 
     }, "Value", "Text") }; 

    return View(person); 
} 

Hier können Sie sehen, dass ich eine Instanz von Person erschaffe und an die Ansicht übergeben. Dies ist der beste Weg, um eine Ansicht mit vordefinierten Werten zu laden. Und der wichtigste vordefinierte Wert ist in diesem Fall die Dropdown-Liste.

The View aussehen würde mehr oder weniger wie folgt aus:

@model Person 

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

    <div class="form-group"> 
     @Html.LabelFor(m => m.Name, htmlAttributes: new { @class = "control-label" }) 
     @Html.EditorFor(m => m.Name, new { htmlAttributes = new { @class = "form-control" } }) 
     @Html.ValidationMessageFor(m => m.Name, "", new { @class = "text-danger" }) 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(m => m.Surname, htmlAttributes: new { @class = "control-label" }) 
     @Html.EditorFor(m => m.Surname, new { htmlAttributes = new { @class = "form-control" } }) 
     @Html.ValidationMessageFor(m => m.Surname, "", new { @class = "text-danger" }) 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(m => m.City, htmlAttributes: new { @class = "control-label" }) 
@* Important *@ 
     @Html.EditorFor(m => m.CitySelectList, new { htmlAttributes = new { @class = "form-control", multiple = "multiple" } }) 
@* /Important *@ 
     @Html.ValidationMessageFor(m => m.City, "", new { @class = "text-danger" }) 
    </div> 

} 

Wie Sie rufe ich die Dropdown-Liste durch eine EditorFor 2 Htmlattributes vorbei zu sehen. Das wichtigste ist multiple = "multiple", da dies die Art der Artikelliste ist, die ich auf der Seite zeigen werde. Wie? Durch eine Editor-Vorlage, die speziell dafür entwickelt wurde. Wenn Sie mit dessen Konzept und Verwendung nicht vertraut sind, können Sie this website für den Start überprüfen. Die Template-Editor kann unten gesehen werden:

@model SelectList 

@{ 
    var htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"]); 
} 

@if (!htmlAttributes.ContainsKey("multiple")) 
{ 
    @Html.DropDownListFor(m => m.SelectedValue, Model.SelectListItems, htmlAttributes) 
} 
else 
{ 
    @Html.ListBoxFor(m => m.SelectedValues, Model.SelectListItems, htmlAttributes) 
} 

Ein Detail an dieser Editor Vorlage: Haben Sie bemerkt, dass ich das Dropdown-Liste/Listenfeld für das SelectedValue erschaffe (n)? Das ist etwas, das ein bisschen Kopfschmerzen verursachen könnte, wenn Sie alle Werte, aber Sie können handhaben, in der POST-Methode, auf diese Weise:

[HttpPost] 
public ActionResult Insert(Person person) 
{ 
    person.City = person.CitySelectList.SelectedValues; 
    // Some code goes here 
    return View(); 
} 

, dass es sein sollte.Aber, wie ich schon sagte, ich habe einen Arbeitscode here, so dass Sie laufen und sehen können, wie es funktioniert. Und auch eine Erklärung des Codes von GitHub right here für den Fall, dass Sie brauchen.

+0

Das Erstellen eines zweiten identischen 'IEnumerable ' aus dem ersten unter Verwendung von 'new SelectList (..)' ist sinnlos. Dies gibt keine Client- oder Serverseite-Validierung, kann nicht für die korrekte 2-Wege-Modellbindung beim Editieren vorhandener Daten verwendet werden, setzt nicht den Wert von 'City' (' SelectedValues' ist 'IEnumerable'), wird alle Optionen verlieren, wenn' return View(); 'heißt usw. etc. –

+0

Ja, aber wie ich schon in der allerersten Zeile gesagt habe:" (...) Ich habe diese Beispiele geschrieben, ohne sie zu testen, aber es ist nur eine allgemeine Vorstellung (.. .) ". –

+0

Die allgemeine Idee ist, stark an eine Modelleigenschaft zu binden (was im OP-Fall sagen wird: IEnumerable SelectedCities', nicht die 'SelectedValues' -Eigenschaft von' SelectList' :) –

0
@Html.ListBoxFor(m => m.location_code, Model.location_type)   
    [HttpPost] 
     public string SaveResults(List<int> location_code) 
     { 

      if (location_code!= null) 
      { 
       return string.Join(",", location_code); 
      } 
      else 
      { 
       return "No values are selected"; 
      } 
     } 
Verwandte Themen