我有类似的东西:
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中显示的“名称”。我需要复合名称,但我无法弄清楚如何...
问候。
答案 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和单个姓名......
所以,
创建方法:
创建视图:
用
替换服务器端代码@ 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());
}
}