如何在asp.net MVC 3中使用@Html.DropDownListFor将两个dataTextField合并为SelectList的描述?

12

我正在返回一些存储的联系人以供DropDownList查看,但我无法在我的SelectList中包含多个dataTextFields。

目前我有:

@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属性结合起来的方法。

更新:我知道可以扩展联系人属性,但我想知道是否有一种更简单的方法在View或Controller中实现。我尝试了这里提供的两种解决方案,但无法成功。如何在SelectList文本描述中组合两个字段?


有没有办法在不修改模型的情况下,在视图或控制器中完成这个任务?只是好奇。谢谢(我知道可以扩展联系人的选项)。 - user864675
8个回答

24

扩展联系人

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

11

我知道这个问题已经有一个被批准的答案,但我不认为这是提问者想要的。我遇到了这个问题,这是我解决它的方法:

@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 可以使用这个新对象来实现我们想要的输出。


2

我已经做过这样的事情:

控制器:

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)

这对我来说完美地工作了!希望它仍然有所帮助!


1

前往您的模型并创建一个与实体名称相同的新联系人类。在声明命名空间时要小心。
这是一些代码,希望能帮到您:

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

在您的控制器中,只需执行以下操作:
data.FullName =data.Firstname+" "+data.LastName;

应该就这样了。


1
有没有办法在View或Controller中完成这个任务而不修改Model?只是好奇。谢谢(我知道扩展联系人的选项)对象的扩展不会修改您的模型,只会添加一个属性;您可以选择使用它或不使用它。如果您真的想避免这种情况,可以创建一个所有Firstname+Lastname的Dictionary<int,string>,然后在视图部分中使用它来填充下拉列表。这可能会有所帮助:http://iwantmymvc.com/populate-drop-down-list-mvc-3 - Mihai Labo
最好在视图模型中完成这个操作,就像我在答案中展示的那样。让视图模型来处理这个字符串拼接。 - Brendan Vogt

1
在你的Contact类中添加一个属性,该属性返回FullName,但考虑到空值、空字符串或空格的名字和姓氏。
[DataMember]
public string FullName
{
    return string.Join(
        " ",
        new string[] { this.FirstName, this.LastName }
            .Where(s => !string.IsNullOrWhiteSpace(s))));
}

1

这是我会怎么做的。只需修改代码以适应您的情况即可。我正在更改我的代码仅供演示目的。

在我看来,我会有以下内容:

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

希望这对你有所帮助。


0
在你的联系人类中添加一个属性,名为FullName,它简单地返回FirstName + " " + LastName。

0

你可以直接从数据库获取联系人信息... 并且使用LINQ查询第一个集合,返回另一个包含ID和FULLNAME的集合... 然后使用这个集合来填充下拉列表。

这只是为了满足你的好奇心... 我认为最简单的方法是扩展你的联系人ViewModel。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接