Как объединить два dataTextFields для SelectList Описание в asp.net MVC 3 с помощью @Html.DropDownListFor

Я возвращаю некоторые сохраненные контакты для просмотра для DropDownList, и я не могу включить в свой SelectList несколько dataTextField.

В настоящее время у меня есть:

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

Я бы хотел:

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

который объединяет свойства FirstName и LastName.

ОБНОВЛЕНИЕ: мне известно о расширении контактного свойства, мне было любопытно, есть ли оптимизированный способ сделать это в представлении или контроллере. Я попробовал два решения здесь безрезультатно. Как объединить два поля в текстовом описании SelectList?

Ответ 1

Расширить контакт

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

Ответ 2

Я понимаю, что этот вопрос имеет одобренный ответ, хотя я не верю в то, что искал искатель. Я пришел к этому вопросу, и именно так я его решил:

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

Как это работает: Мы используем linq для выбора конкретных данных из нашего списка и размещения их в нашем новом объекте. Этот новый объект будет содержать только два свойства: "ID_Value" и "FullName". Теперь наш DropDownListFor может работать с этим новым объектом для достижения желаемого результата.

Ответ 3

Я сделал что-то вроде этого:

Контроллер:

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

И в представлении я сделал это вот так:

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

Он отлично работает для меня! Я надеюсь, что это все еще поможет!

Ответ 4

Перейдите в свою модель и создайте новый класс Contact с тем же именем. Будьте осторожны при объявлении пространства имен.
Вот код, который поможет (надеюсь):

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

В вашем контроллере просто сделайте что-то вроде:

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

Это должно сделать это.

Ответ 5

Добавьте свойство в класс Contact, который возвращает FullName, но учитывает нулевые, пустые или пробельные имена или имена:

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

Ответ 6

Вот как бы я это сделал. Просто измените код, чтобы он соответствовал вашему сценарию. Я меняю свой код только для демонстрационных целей.

На мой взгляд, у меня было бы следующее:

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

Моя модель просмотра:

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

Мой класс банка:

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

В моем действии контроллера:

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

     return View(viewModel);
}

Надеюсь, это поможет.

Ответ 7

Добавьте свойство в свой контактный класс с именем FullName, который просто возвращает FirstName + "" + LastName.

Ответ 8

Вы можете получить свои контакты из БД, поскольку они... и используя LINQ, вы можете запросить первую коллекцию, возвращающую другую коллекцию с идентификатором и FULLNAME... затем используйте эту коллекцию, чтобы заполнить свой раскрывающийся список.

Это было просто для того, чтобы помочь вашему любопытству... Я думаю, что лучший способ - расширить вашу Contact ViewModel для простоты.