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) 

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