第 1 部分:解释 Lambda 魔法
你不是一个人。 Lambdas + MVC 使编码变得非常简单,但它们也使它看起来相当神奇(由于抽象)。
查看 DropDownListFor 方法的第一个参数 [...] 我是否正确理解“m”代表传递到视图中的模型类的实例?
Yes.
Razor 中的 HTML 助手 + Lambda 既简单又神奇,因为它们走的是捷径,实际上并没有向您透露发生了什么。
首先我们来看看@Html
。我们知道@
开始我们的 Razor 语法,然后Html
是魔法。实际上,Html
is an html助手 http://msdn.microsoft.com/en-us/library/system.web.mvc.htmlhelper%28v=vs.108%29.aspx自动初始化并提供给您的对象。更具体地说,它是一个HtmlHelper<TModel>
。 Razor HTML 编辑器很智能,可以根据您所说的此视图的模型类型提前知道 TModel 的类型。这就是为什么你有如此多的智能感知。
当您输入时
@model IEnumerable<BusinessLayer.Employee>
编辑器阅读了该内容并假设 HTML Helper 将是HtmlHelper<IEnumerable<BusinessLayer.Employee>>
。当编译页面时,HTML 帮助器实际上就是这种类型(当然)。
那么呢DropDownListFor
或者任何其他扩展方法?
看着下拉列表的 http://msdn.microsoft.com/en-us/library/ee703573%28v=vs.108%29.aspx我们可以看到它实际上是DropDownListFor<TModel, TProperty>
。我们现在知道 Model 是您的视图模型类型。DropDownListFor
知道这一点,因为该方法是延伸 HtmlHelper<TModel>
。因此 DropDownListFor 知道传入类型是在视图顶部定义的任何类型。关于什么TProperty
?
TProperty
是返回类型。这是您在选择属性时指定的类型。该视图为 HtmlHelper 提供模型类型,然后 HtmlHelper 为 DropDownListFor 提供模型类型,现在您处于 lambda 表达式中:(x => x.Property)
您选择属性,然后属性会为您选择类型;在这种情况下string(性别)。
第 2 部分:您的问题
如果不确切知道您想要实现什么目标,则很难回答您的问题。您是否有一组员工,并且想要为每个员工显示多个性别下拉框,然后保存它们?
处理集合时会有点棘手,因为 MVC 不能很好地开箱即用地处理它们;通常最好根据您需要完成的任务编写自己的解决方案。
我真的不喜欢单个视图在页面上获取事物集合的想法。考虑一下这段逻辑:
你的方式:
- 获取员工集合
- 让员工有视野
- 让视图创建单个 SelectListItem
- 循环并显示每个 Employee 的 SelectList
My way
- 获取员工集合
- 给员工一个视野
- 让视图循环并将每个员工传递到另一个视图(部分)
- 每个部分处理一个员工
使用 MVC 时,请尝试将事物分解为小的逻辑部分。观点应该是愚蠢的;这意味着他们不应该真正做任何逻辑或思考。这样事情就会变得更容易,并且可以确保你的观点不会变成怪物。
示例解决方案演练
尝试这个:
创建一个名为 _ 的新 PartialView员工性别.cshtml与您正在使用的视图位于同一文件夹中。
使用此代码
_EmployeeGender.cshtml
@model BusinessLayer.Employee
<tr>
<td>
@{
var listItems = new List<SelectListItem>()
{
new SelectListItem {Text = "Male", Value = "M"},
new SelectListItem {Text = "Female", Value = "F"}
};
@Html.DropDownListFor(m => m.Gender, listItems, string.Empty)
}
</td>
</tr>
你原来的看法
@model IEnumerable<BusinessLayer.Employee>
@{
ViewBag.Title = "Employees";
}
<h2>Employees</h2>
<table>
@foreach (var employee in Model)
{
Html.RenderPartial("_EmployeeGender", employee);
}
</table>
Results
让我们看看我们的生成的 HTML now:
<table>
<tr>
<td>
<select id="Gender" name="Gender"><option value=""></option>
<option selected="selected" value="M">Male</option>
<option value="F">Female</option>
</select>
</td>
</tr><tr>
<td>
<select id="Gender" name="Gender"><option value=""></option>
<option value="M">Male</option>
<option selected="selected" value="F">Female</option>
</select>
</td>
</tr></table>
我们可以看到现在有一个空白选择,并且我们的下拉框会根据员工的值自动选择(我创建了一名男性员工和一名女性员工)。
Do Note认为id
and name
HTML 属性是相同的。如果您想提交包含这些值的表单,则需要更多工作。但这对您来说是一个合理的起点。