2016-07-21 23 views
0

ich folgendes in meiner Sicht haben:@ Html.DropDownListFor - Wie zusätzliche <option> anhängen zur Liste

@Html.DropDownListFor(m => m.Category, new SelectList(Model.categories, "Id", "Name", Model.Category), "All", new { @class = "form-control" }) 

<select name="Category" id="Category"> 
<option value="">All</option> 
<option value="1">Debug</option> 
<option value="2" selected="selected">Error</option> 
</select> 

In meinem Repo ich die Werte erhalten, wie folgt:

public IEnumerable<Category> GetCategories() 
    { 
     return _context.Category.ToList(); 
    } 

Wie kann ich Geben Sie All einen Wert von 0 anstelle von leeren Zeichenfolge?

Gibt es eine Möglichkeit, es an meine Repomethode unten anzuhängen, wie ich meinen Controller sauber halten möchte.

public IEnumerable<SelectListItem> GetCategoriesSelectList() 
    { 

     return _context.Category 
      .Select(s => new SelectListItem 
      { 
       Value = s.Id.ToString(), 
       Text = s.Name 
      }).ToList(); 


    } 

* UPDATE *

ich folgende Helfer gefunden habe, aber kann nicht herausfinden, wie es zu benutzen:

public static SelectList AddFirstItem(SelectList origList, SelectListItem firstItem) 
    { 
     List<SelectListItem> newList = origList.ToList(); 
     newList.Insert(0, firstItem); 

     var selectedItem = newList.FirstOrDefault(item => item.Selected); 
     var selectedItemValue = String.Empty; 
     if (selectedItem != null) 
     { 
      selectedItemValue = selectedItem.Value; 
     } 

     return new SelectList(newList, "Value", "Text", selectedItemValue); 
    } 

Aus meiner Sicht habe ich:

@Html.DropDownListFor(m => m.Category, Helpers.AddFirstItem(new SelectList(Model.categories, "Id", "Name", Model.Category), "All"), null, new { @class = "form-control" }) 

Was gebe ich als zweites Argument - das obige funktioniert nicht?

+0

Erstellen Sie Ihr 'IEnumerable ' in der Steuerung und fügen Sie ein neues 'SelectListItem' mit' Text = "All" 'und' Wert = "0" ', um es –

+0

@ozzii Wenn Sie kein Problem mit der Datenbankintegrität, Fremdschlüsselverstößen und allem haben möchten, schlage ich vor, dass Sie die benötigten Optionen direkt in die Datenbank einfügen. –

Antwort

1

Erstellen Sie Ihre SelectList in der Steuerung, die ein SelectListItem mit Text = "All" und Value = "0" zum Beispiel

IEnumerable<SelectListItem> categories = new List<SelectListItem> 
{ 
    new SelectListItem() {Value = "0", Text = "All" } 

}.Concat(GetCategories().Select(x => new SelectListItem 
{ 
    Value = x.Id.ToString(), 
    Text = x.Name 
}); 

und dann pas es zu der Ansicht, idealerweise in einer Ansicht Modelleigenschaft enthält, aber man konnte verwenden ViewBag

ViewBag.CategoryList = categories; 

und in der Ansicht

@Html.DropDownListFor(m => m.Category,(IEnumerable<SelectListItem>)ViewBag.CategoryList, new { @class = "form-control" }) 
+0

Hinweis: Wenn Sie den Code nicht in Ihrem Controller haben wollen, refactorieren Sie ihn einfach in eine separate Methode –

+0

Ich bekomme Fehler 'List ' enthält keine Definition für Value' – adam78

+0

Hoppla, vergessen Sie es anzukündigen. Siehe Bearbeiten Hinweis: Ich nahm an, dass Sie zuerst "Alle" wollten, aber Sie können sie austauschen - 'GetCategories()' zuerst, dann '.Concat()' das neue Element –

1

Bitte versuchen Sie dies:

public IEnumerable<SelectListItem> GetCategoriesSelectList() 
{ 

    return _context.Category 
     .Select(s => new SelectListItem 
     { 
      Value = s.Id.ToString(), 
      Text = s.Name 
     }).ToList().Add(new SelectListItem() { Text="all",Value="0" }); 


}