10

Tôi đang trả về một số liên hệ được lưu trữ để xem cho DropDownList và tôi không thể bao gồm nhiều dataTextFields trên SelectList của tôi.Làm thế nào để kết hợp hai dataTextFields cho SelectList Mô tả trong asp.net MVC 3 bằng cách sử dụng @ Html.DropDownListFor

Hiện nay tôi có:

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

Tôi muốn có:

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

kết hợp cả hai thuộc tính FirstName và LastName.

CẬP NHẬT: Tôi biết về việc mở rộng thuộc tính liên hệ, tôi tò mò là có một cách hợp lý để thực hiện việc này trong Chế độ xem hoặc Bộ điều khiển. Tôi đã thử hai giải pháp here để không có kết quả. How can I combine two fields in a SelectList text description?

+0

Có giải pháp nào để thực hiện việc này trong Chế độ xem hoặc Bộ điều khiển mà không sửa đổi Mô hình không? Chỉ tò mò thôi. Cảm ơn (Tôi đã nhận thức được tùy chọn mở rộng địa chỉ liên lạc) – user864675

Trả lời

22

Mở rộng tiếp xúc

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

Thêm thuộc tính vào lớp Liên hệ có tên là FullName chỉ trả về FirstName + "" + LastName.

1

Đến Model của bạn và tạo ra một lớp Liên hệ mới với tên thực thể giống nhau. Hãy cẩn thận khi khai báo không gian tên.
Dưới đây là một số mã sẽ giúp (Tôi hy vọng):

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

Trong điều khiển của bạn chỉ cần làm một cái gì đó như:

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

Điều đó sẽ làm điều đó.

+1

"Có một giải pháp để thực hiện điều này trong Chế độ xem hoặc Bộ điều khiển mà không sửa đổi Mô hình? Chỉ cần tò mò. Cảm ơn (Tôi đã biết tùy chọn mở rộng địa chỉ liên hệ)" - Phần mở rộng của Object không sửa đổi Model của bạn. Chỉ cần thêm một sự phù hợp; quyết định của bạn nếu bạn sử dụng nó hay không. Nếu bạn thực sự muốn tránh rằng bạn có thể tạo một từ điển của tất cả Firstname + LastName và sau đó sử dụng nó trong trình đơn thả xuống của bạn trong phần xem. Điều này có thể giúp: http://iwantmymvc.com/populate-drop-down-list-mvc-3 –

+0

Thay vì làm điều này trong mô hình xem như những gì tôi đã thể hiện trong câu trả lời của tôi. Hãy để mô hình xem chăm sóc việc ghép nối này. –

1

Thêm một tài sản để lớp Contact của bạn mà trả FullName nhưng sẽ đưa vào vô tài khoản, tên rỗng hoặc khoảng trắng đầu tiên hoặc cuối cùng:

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

Sau đây là cách tôi đã làm nó. Chỉ cần sửa đổi mã để phù hợp với kịch bản của bạn. Tôi đang thay đổi mã của tôi chỉ cho mục đích demo.

Theo quan điểm của tôi, tôi sẽ phải như sau:

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

xem mô hình của tôi:

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

lớp ngân hàng của tôi:

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

Trong controller action của tôi:

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

    return View(viewModel); 
} 

Tôi hy vọng điều này sẽ hữu ích.

0

Bạn có thể nhận danh bạ từ DB vì chúng ... và sử dụng LINQ bạn có thể truy vấn bộ sưu tập đầu tiên trả về bộ sưu tập khác có ID và FULLNAME ... sau đó sử dụng bộ sưu tập này để điền danh sách thả xuống của bạn.

Thats chỉ là để giúp bạn tò mò ... Tôi nghĩ cách tốt nhất là mở rộng ContactModel của bạn để đơn giản.

8

Tôi nhận thấy câu hỏi này có câu trả lời được chấp thuận, mặc dù tôi không tin đó là điều người hỏi đang tìm kiếm. Tôi đi vào vấn đề này và đây là cách tôi giải quyết nó:

@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ách hoạt động: Chúng tôi đang sử dụng LINQ để chọn dữ liệu cụ thể từ các danh sách của chúng tôi và đặt nó vào đối tượng mới của chúng tôi. Đối tượng mới này sẽ chỉ chứa hai thuộc tính, 'ID_Value' và 'FullName'. Bây giờ DropDownListFor của chúng tôi có thể làm việc với đối tượng mới này để đạt được kết quả mong muốn của chúng tôi.

2

Tôi đã làm một cái gì đó như thế này:

Bộ điều khiển:

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

Và trong Xem Tôi đã thực hiện nó như thế này:

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

Nó hoạt động một cách hoàn hảo đối với tôi! Tôi hy vọng nó vẫn giúp!