10

我将一些存储的联系人可以查看DropDownList的,我不能够包括在我的SelectList多个dataTextFields 2个dataTextFields为的SelectList说明结合在asp.net MVC 3。如何使用@ Html.DropDownListFor

目前我有:

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

它结合了名字和姓氏的属性。

更新:我知道延伸的接触性,我很好奇,是有一个流线型的方式在视图或控制器来实现这一目标。我试了两个解决方案here无济于事。 How can I combine two fields in a SelectList text description?

+0

是否有解决方案在视图或控制器内完成此操作而无需修改模型?只是好奇。谢谢(我意识到可以选择扩展联系人) – user864675 2012-04-05 15:06:31

回答

22

扩展接触

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

一个属性添加到名为全名联系人类,只是返回姓+“” +姓氏。

1

转到你的模型,并创建一个新的联系人类相同的实体名称。声明名称空间时要小心。
下面是一些代码,这将有助于(我希望):

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

在您的控制器只是这样做:

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

应该这样做。

+1

“是否有解决方案在视图或控制器内完成此操作而无需修改模型?只是好奇。谢谢(我意识到扩展联系人的选项)” - 对象的扩展不会修改您的模型。只是增加了一个礼节;你的决定,如果你使用它或不。如果您真的想避免这种情况,您可以创建所有名字+姓的字典,然后在视图部分的下拉列表中使用它。这可能有所帮助:http://iwantmymvc.com/populate-drop-down-list-mvc-3 – 2012-04-05 15:15:37

+0

相反,在视图模型中,就像我在答案中显示的那样。让视图模型处理这种连接。 – 2012-04-05 15:51:24

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

你可以从DB您的联系人,因为他们是...,并使用LINQ可以查询第一集合返回与ID和FULLNAME另一个集合......然后使用这个集合来填充下拉列表。

那只是为了帮助你的好奇心......我认为最好的办法是延长您的联系方式的ViewModel为简单起见。

8

我意识到这个问题有一个批准的答案,但我不相信这是提问者正在寻找什么。我到了这个问题,这是我如何解决它:

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

它可以完美的我!我希望它仍然有帮助!

相关问题