10

Sto restituendo alcuni contatti memorizzati alla vista per DropDownList e non sono in grado di includere più campi DataText sulla mia lista di selezione.Come combinare due dataTextFields per SelectList Descrizione in asp.net MVC 3 utilizzando @ Html.DropDownListFor

Attualmente ho:

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

Mi piacerebbe avere:

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

che combina entrambe le proprietà FirstName e LastName.

AGGIORNAMENTO: Sono a conoscenza dell'estensione della proprietà dei contatti, ero curioso che esistesse un modo più semplice per ottenere ciò nella vista o nel controller. Ho provato le due soluzioni here inutilmente. How can I combine two fields in a SelectList text description?

+0

Esiste una soluzione per eseguire ciò all'interno della vista o del controller senza modificare il modello? Solo curioso. Grazie (ero a conoscenza dell'opzione di estendere i contatti) – user864675

risposta

22

Estendere contatto

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

Aggiungere una proprietà alla classe Contact denominata FullName che restituisce semplicemente FirstName + "" + LastName.

1

Vai al tuo modello e creare una nuova classe di contatto con lo stesso nome dell'entità. Fai attenzione quando dichiari lo spazio dei nomi.
Ecco po 'di codice che vi aiuterà (spero):

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

Nel vostro controller basta fare qualcosa di simile:

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

Che dovrebbe farlo.

+1

"C'è una soluzione per realizzare questo all'interno della vista o del controller senza modificare il modello? Solo curioso. Grazie (ero consapevole dell'opzione di estendere i contatti)" - L'estensione dell'oggetto non modifica il tuo modello. Aggiunge solo una proprietà; è la tua decisione se la usi o meno. Se vuoi davvero evitarlo, puoi creare un Dizionario di tutti i Nome + Cognome e quindi usarlo nel menu a discesa nella vista. Questo potrebbe aiutare: http://iwantmymvc.com/populate-drop-down-list-mvc-3 –

+0

Fare piuttosto questo nel modello di visualizzazione come quello che ho mostrato nella mia risposta. Lascia che il modello della vista si occupi di questa concatenazione. –

1

aggiunge una proprietà alla classe Contact che restituisce FullName ma prende in considerazione nulla, nomi o cognomi vuoti o spazi bianchi:

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

ecco come lo avrei fatto. Basta modificare il codice per adattarlo al tuo scenario. Sto cambiando il mio codice solo per scopi dimostrativi.

A mio avviso avrei la seguente:

@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> 

mio punto di vista il modello:

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

La mia classe banca:

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

Nella mia azione di controllo:

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

    return View(viewModel); 
} 

Spero che questo aiuti.

0

È possibile ottenere i contatti dal DB così come sono ... e utilizzando LINQ è possibile interrogare la prima raccolta restituendo un'altra raccolta con ID e FULLNAME ... quindi utilizzare questa raccolta per compilare il proprio elenco a discesa.

Questo è stato solo per aiutare la tua curiosità ... Credo che il modo migliore sia estendere ContactModel per semplicità.

8

Mi rendo conto che questa domanda ha una risposta approvata, anche se non credo che sia ciò che il richiedente stava cercando. Sono venuto in questo problema e questo è come ho risolto:

@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;" }) 

Come funziona: Stiamo usando LINQ per selezionare i dati specifici della nostra lista e inserirlo nel nostro nuovo oggetto. Questo nuovo oggetto conterrà solo due proprietà, 'ID_Value' e 'FullName'. Ora il nostro DropDownListFor può lavorare con questo nuovo oggetto per ottenere l'output desiderato.

2

ho fatto qualcosa di simile:

Controller:

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

E alla vista che ho fatto in questo modo:

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

Funziona perfettamente per me! Spero che aiuti ancora!

Problemi correlati