10

Estoy devolviendo algunos contactos almacenados para ver DropDownList y no puedo incluir múltiples dataTextFields en mi lista de selección.Cómo combinar dos dataTextFields para SelectList Descripción en asp.net MVC 3 usando @ Html.DropDownListFor

Actualmente tengo:

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

me gustaría tener:

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

que combina las propiedades Nombre y Apellido.

ACTUALIZACIÓN: Soy consciente de extender la propiedad de contacto, tenía curiosidad de que haya una manera simplificada de lograr esto en la Vista o el Controlador. Probé las dos soluciones here en vano. How can I combine two fields in a SelectList text description?

+0

¿Existe una solución para lograr esto dentro de la Vista o el Controlador sin modificar el Modelo? Sólo curioso. Gracias (estaba al tanto de la opción de extender los contactos) – user864675

Respuesta

22

Extender contacto

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

Agregue una propiedad a su clase de contacto llamada FullName que simplemente devuelve FirstName + "" + LastName.

1

Vaya a su modelo y crear una nueva clase de contacto con el mismo nombre de la entidad. Tenga cuidado al declarar el espacio de nombres.
Aquí hay un código que le ayudará (espero):

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

En su controlador acaba de hacer algo como:

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

Eso debería hacerlo.

+1

"¿Hay alguna solución para lograr esto dentro de la Vista o el Controlador sin modificar el Modelo? Simplemente curioso. Gracias (era consciente de la opción de extender los contactos)" - La extensión del objeto no modifica su modelo. Solo agrega una propiedad; es su decisión si lo usa o no. Si realmente quieres evitar eso, puedes crear un Dictionary de todos los Firstname + Lastname y luego usarlo en tu menú desplegable en la parte de la vista. Esto podría ayudar: http://iwantmymvc.com/populate-drop-down-list-mvc-3 –

+0

Haga esto en el modelo de vista como lo que mostré en mi respuesta. Deje que el modelo de vista se ocupe de esta concatenación. –

1

añadir un alojamiento a su clase Contact que devuelve FullName, pero toma en cuenta nulo, primeros o últimos nombres vacíos o espacios en blanco:

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

Aquí es cómo lo habría hecho. Simplemente modifica el código para que se ajuste a tu escenario. Estoy cambiando mi código solo para propósitos de demostración.

A mi me gustaría tener lo siguiente:

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

Mi vista del modelo:

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

Mi clase de banco:

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

En mi acción del controlador:

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

    return View(viewModel); 
} 

Espero que esto ayude.

0

Puede obtener sus contactos de DB tal como están ... y utilizando LINQ puede consultar la primera colección devolviendo otra colección con ID y FULLNAME ... luego use esta colección para completar su lista desplegable.

Eso fue solo para ayudar a su curiosidad ... Creo que la mejor manera es ampliar su ViewModel de contacto para simplificar.

8

Me doy cuenta de que esta pregunta tiene una respuesta aprobada, aunque no creo que sea lo que el solicitante estaba buscando. Yo vine a este tema y así es como lo resolví:

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

¿Cómo funciona esto: Estamos utilizando LINQ para seleccionar datos específicos de nuestra lista y colocarlo en nuestro nuevo objeto. Este nuevo objeto contendrá solo dos propiedades, 'ID_Value' y 'FullName'. Ahora nuestro DropDownListFor puede funcionar con este nuevo objeto para lograr nuestro resultado deseado.

2

he hecho algo como esto:

controlador:

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

Y en la vista que lo han hecho así:

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

Funciona perfectamente para mí! ¡Espero que todavía ayude!

Cuestiones relacionadas