【问题标题】:How to combine two dataTextFields for SelectList Description in asp.net MVC 3 using @Html.DropDownListFor如何使用 @Html.DropDownListFor 在 asp.net MVC 3 中为 SelectList 描述组合两个 dataTextFields
【发布时间】:2012-04-19 07:40:48
【问题描述】:

我正在返回一些存储的联系人以查看 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 属性。

更新:我知道扩展联系人属性,我很好奇是否有一种简化的方法可以在视图或控制器中完成此操作。我尝试了两种解决方案here 无济于事。 How can I combine two fields in a SelectList text description?

【问题讨论】:

  • 是否有解决方案可以在视图或控制器中完成此操作而无需修改模型?只是好奇。谢谢(我知道扩展联系人的选项)

标签: asp.net-mvc asp.net-mvc-3 razor selectlist html.dropdownlistfor


【解决方案1】:

向您的联系人类添加一个名为 FullName 的属性,该属性仅返回 FirstName + " " + LastName。

【讨论】:

    【解决方案2】:

    扩展联系

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

    【讨论】:

      【解决方案3】:

      转到您的模型并创建一个具有相同实体名称的新联系人类。声明命名空间时要小心。
      这里有一些代码会有所帮助(我希望):

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

      在您的控制器中,只需执行以下操作:

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

      应该这样做。

      【讨论】:

      • “是否有解决方案可以在视图或控制器中完成此操作而无需修改模型?只是好奇。谢谢(我知道扩展联系人的选项)” - 对象的扩展不会修改您的模型。只是增加了一个礼节;使用与否由您决定。如果您真的想避免这种情况,您可以创建一个包含所有 Firstname+Lastname 的 Dictionary ,然后在视图部分的下拉列表中使用它。这可能会有所帮助:iwantmymvc.com/populate-drop-down-list-mvc-3
      • 而不是像我在答案中显示的那样在视图模型中执行此操作。让视图模型处理这种连接。
      【解决方案4】:

      向您的Contact 类添加一个属性,该属性返回FullName,但考虑到null、空或空格的名字或姓氏:

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

      【讨论】:

        【解决方案5】:

        这就是我的做法。只需修改代码以适合您的场景。我只是为了演示目的而更改我的代码。

        在我看来,我会有以下几点:

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

        我希望这会有所帮助。

        【讨论】:

          【解决方案6】:

          您可以按原样从 DB 中获取联系人...并使用 LINQ 查询第一个集合,返回另一个具有 ID 和 FULLNAME 的集合...然后使用此集合填充您的下拉列表。

          那只是为了满足您的好奇心...我认为最好的方法是为了简单起见扩展您的 Contact ViewModel。

          【讨论】:

            【解决方案7】:

            我知道这个问题的答案是经过批准的,但我不相信这就是提问者想要的。我遇到了这个问题,这就是我解决它的方法:

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

            【讨论】:

              【解决方案8】:

              我做过这样的事情:

              控制器:

              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)
              

              它非常适合我!我希望它仍然有帮助!

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-11-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多