以强类型形式在DropDownList(MVC)中显示复合文本

时间:2013-01-28 23:43:02

标签: asp.net-mvc drop-down-menu

我有类似的东西:

public class employee
{
    Int id;
    String Name;
    String FamilyName;
    String SecondFamilyName;
}  

public class orders
{
    Int id;
    Int employeeid;
    Int amount;
}

(员工可以通过“employeeid”财产获得许多订单,订单和员工相关)

MVC中强类型的“创建订单”表单:

  • DropDownList允许我在创建订单时选择合适的员工。

  • DropDownList应以第三种方法定义的方式显示员工姓名,它为SecondFamilyName不为空的员工连接“FamilyName SecondFamilyName,Name”,为另一方提供“FamilyName,Name”。

我该怎么办?使用默认的VS 2010模板,运行时选择要在DropDownList中显示的“名称”。我需要复合名称,但我无法弄清楚如何...

问候。

2 个答案:

答案 0 :(得分:0)

我为DropDownList创建了一个自定义编辑模板:

<select id="employeeid" name="employeeid">
    <option value="">Pick an employee</option>
    @foreach (SelectListItem sli in ViewBag.Employees)
    {
        <option value="@sli.Value">@sli.Text</option>
    }
</select>

它显示了我需要的字符串,它绑定到employeeid字段。我能够创建新对象并显示我想要的员工姓名。

相当简单,当像我这样的人缺乏这项基本任务的技巧时,这很难。 MVC是一个完全不同的新世界......

答案 1 :(得分:0)

更新2,

工作了几个小时之后,我注意到,默认情况下,VS 2010会生成一个模板,该模板正在Create方法中填充,其中包含员工ID和单个姓名......

所以,

创建方法:

  • 使用(ids,复合名称)列表
  • 添加ViewBag.employeeid

创建视图:

  • 替换服务器端代码

    @ Html.DropDownList(“employeeid”,String.Empty)

这就是全部。我觉得愚蠢之前没有看到这么明显的事情......

你觉得怎么样,Dave A?

修改

只需添加用于构建列表和复合名称的代码:

<强> - &GT; Employee html helper,生成SelectList(带选定项)

public static class employeeHelper
{
    public static IEnumerable<SelectListItem> toSelectListItems(this IEnumerable<employee> Employees, Nullable<Int32> selectedID)
    {
        List<SelectListItem> lEmployees = new List<SelectListItem>();

        foreach (employee ee in Employees)
            lEmployees.Add(new SelectListItem
            {
                Selected = selectedID != null && ee.id == selectedID.Value,
                Text = employeeExtender.getEmployeeNames(pp),
                Value = pp.id.ToString()         
            });

        lEmployees = lEmployees.OrderBy(p => p.Text).ToList();

        return lEmployees;
    }
}

<强> - &GT;员工扩展程序,以获取复合名称 使用Stringbuilder提高性能

public class employeeExtender
{
    public static String getEmployeeNames(employee e)
    {
        if (e == null)
            return null;

        StringBuilder sb = new StringBuilder();

        sb.Append(e.FamilyName.ToLower());

        if (!String.IsNullOrEmpty(e.SecondFamilyName) && e.SecondFamilyName.Trim() != String.Empty)
            sb.Append(" " + e.SecondFamilyName.ToLower());

        sb.Append(", ");
        sb.Append(e.Name.ToLower());

        //Capitalize String
        return Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(sb.ToString());
    }
}