10

Ich gebe einige gespeicherte Kontakte zur Anzeige für DropDownList zurück und ich bin nicht in der Lage, mehrere DataTextFields in meine SelectList aufzunehmen.Wie man zwei DataTextFields für SelectList kombiniert Beschreibung in asp.net MVC 3 mit @ Html.DropDownListFor

Zur Zeit habe ich:

@Html.DropDownListFor(model => model.Account.AccountContacts, 
     new SelectList(ViewBag.DDContacts, "Contact.ContactID", "Contact.FullName"),   
     new { @class = "select", style = "width: 100px;" }) 

, die beide Eigenschaften Vorname und Nachname kombiniert:

@Html.DropDownListFor(model => model.Account.AccountContacts, 
     new SelectList(ViewBag.DDContacts, "Contact.ContactID", "Contact.FirstName"), 
     new { @class = "select", style = "width: 100px;" }) 

ich haben möchte.

UPDATE: Ich bin mir bewusst, die Kontakteigenschaften zu erweitern, ich war neugierig, gab es eine Stromlinienform, dies in der Ansicht oder Controller zu erreichen. Ich habe die beiden Lösungen here vergeblich versucht. How can I combine two fields in a SelectList text description?

+0

Gibt es eine Lösung, um dies innerhalb der View oder des Controllers zu erreichen, ohne das Modell zu modifizieren? Nur neugierig. Danke (mir war die Option der Erweiterung der Kontakte bekannt) – user864675

Antwort

22

Extend Kontakt

public partial class Contact 
{ 
    private string _nameFull; 
    public string NameFull 
    { 
     get{return FirstName + " " + LastName;} 
    } 
} 
0

Fügen Sie Ihrer Contact-Klasse FullName eine Eigenschaft hinzu, die einfach FirstName + "" + LastName zurückgibt.

1

Gehen Sie zu Ihrem Modell und erstellen Sie einen neuen Kontakt Klasse mit dem gleichen Elementnamen. Seien Sie vorsichtig beim Deklarieren des Namensraums.
Hier einige Code, der helfen (hoffe ich):

public partial class Contact 
{ 
    [DataMember] 
    public string FullName{ get;set;} 
} 

In Ihrem Controller tun etwas wie:

data.FullName =data.Firstname+" "+data.LastName; 

Das sollte es tun.

+1

"Gibt es eine Lösung, um dies innerhalb der View oder der Controller zu erreichen, ohne das Modell zu modifizieren? Nur neugierig. Danke (mir war die Option der Erweiterung der Kontakte bewusst)" - Die Erweiterung des Objekts ändert Ihr Modell nicht. Fügt nur einen Anstand hinzu; Es ist Ihre Entscheidung, ob Sie es benutzen oder nicht. Wenn Sie das wirklich vermeiden wollen, können Sie ein Dictionary aller Vornamen + Nachnamen erstellen und es dann in Ihrem Dropdown im Ansichtsteil verwenden. Dies könnte helfen: http://iwantmymvc.com/populate-drop-down-list-mvc-3 –

+0

Stattdessen tun dies in der Ansicht Modell wie das, was ich in meiner Antwort gezeigt. Lassen Sie das View-Modell diese Verkettung übernehmen. –

1

der Unterkunft um Ihre Contact Klasse hinzufügen, die FullName berücksichtigt aber null, leer oder Leerzeichen Vor- oder Nachnamen zurückgibt:

[DataMember] 
public string FullName 
{ 
    return string.Join(
     " ", 
     new string[] { this.FirstName, this.LastName } 
      .Where(s => !string.IsNullOrWhiteSpace(s)))); 
} 
1

Hier ist, wie ich es getan hätte. Passen Sie den Code einfach an Ihr Szenario an. Ich ändere meinen Code nur für Demozwecke.

Aus meiner Sicht ich folgendes haben würde:

@model MyProject.ViewModels.MyViewModel 

<table> 
    <tr> 
      <td><b>Bank:</b></td> 
      <td> 
       @Html.DropDownListFor(
        x => x.BankId, 
        new SelectList(Model.Banks, "Id", "IdAndName", Model.BankId), 
        "-- Select --" 
       ) 
       @Html.ValidationMessageFor(x => x.BankId) 
      </td> 
    <tr> 
</table> 

Meine Ansicht Modell:

public class MyViewModel 
{ 
    public int BankId { get; set; } 
    public IEnumerable<Bank> Banks { get; set; } 
} 

Meine Bank Klasse:

public class Bank : IEntity 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public bool IsActive { get; set; } 

    // This property will bring back the concatenated value. 
    // If the Id is 1 and Name is My Bank, 
    // then the concatenated result would be 1: My Bank 
    public string IdAndName 
    { 
      get 
      { 
       return (Id.ToString() + ": " + Name); 
      } 
    } 
} 

In meinem Controller-Aktion:

public ActionResult MyActionMethod() 
{ 
    MyViewModel viewModel = new MyViewModel 
    { 
      Banks = bankService.GetAll() // Database call to get all the banks 
    }; 

    return View(viewModel); 
} 

Ich hoffe, das hilft.

0

Sie können Ihre Kontakte von der DB abrufen, wie sie sind ... und mit LINQ können Sie die erste Sammlung abfragen, die eine andere Sammlung mit ID und FULLNAME zurückgibt ... dann diese Sammlung verwenden, um Ihre Dropdownliste zu füllen.

Das war nur, um Ihrer Neugierde zu helfen ... Ich denke, der beste Weg ist, Ihr Contact ViewModel zur Vereinfachung zu erweitern.

8

Ich weiß, dass diese Frage eine genehmigte Antwort hat, obwohl ich nicht glaube, dass es das ist, wonach der Fragesteller gesucht hat. Ich kam in diese Frage, und das ist, wie ich es gelöst:

@Html.DropDownListFor(model => model.Account.AccountContacts, 
    new SelectList((from c in ViewBag.DDContacts.ToList() select new { 
     ID_Value = c.Contact.ContactID, 
     FullName = c.Contact.FirstName + " " + c.Contact.LastName 
    }), "ID_Value", "FullName"), 
    new { @class = "select", style = "width: 100px;" }) 

Wie das funktioniert: Wir Linq werden mit speziellen Daten aus unserer Liste auszuwählen und es in unser neues Objekt zu platzieren. Dieses neue Objekt enthält nur zwei Eigenschaften, ID_Value und FullName. Jetzt kann unsere DropDownListFor mit diesem neuen Objekt arbeiten, um unsere gewünschte Ausgabe zu erreichen.

2

Ich habe so etwas getan:

Controller:

ViewBag.Regiones = from p in modeloDB.Regiones.ToList() select new { 
    Id = p.Id, 
    Nombre = p.Codigo + " - " + p.Nombre 
}; 

Und in der Ansicht Ich habe es so gemacht:

@Html.DropDownListFor(model => model.Region, 
new SelectList(@ViewBag.Regiones, "Id", "Nombre"), 
new { @class = "comboBox" }) 
@Html.ValidationMessageFor(model => model.Region) 

Es funktioniert perfekt für mich! Ich hoffe es hilft trotzdem!