[英]Understanding list of objects based View syntax ASP.NET MVC
嗨我使用Visual Studio模板創建了View,它應該顯示對象列表。 以下是Visual Studio生成的語法:
@model IEnumerable<TestMVCApplication.Models.Product>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.name)
</th>
<th>
@Html.DisplayNameFor(model => model.available)
</th>
<th>
@Html.DisplayNameFor(model => model.price)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.name)
</td>
<td>
@Html.DisplayFor(modelItem => item.available)
</td>
<td>
@Html.DisplayFor(modelItem => item.price)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
@Html.ActionLink("Details", "Details", new { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
</td>
</tr>
}
</table>
我對上面的語法感到困惑。 尤其:
1)我們第一次看到以上內容:
@Html.DisplayNameFor(model => model.name)
我知道要引用模型我們應該使用Model
( 使用大寫M )。 為什么它上面用小m
? model
(小m)意味着什么? IDE如何知道model.name
存在(小m)。
如果將使用Model.Name
,則意味着IEnumerable
具有屬性Name
(對嗎?),但情況並非如此? 對假人的解釋。 什么是真正的model
(小m)?
2)最后這個:
@Html.DisplayFor(modelItem => item.name)
也令人困惑。 什么是modelItem
- 它沒有在任何地方聲明? 怎么會出現在這里? 這是怎么回事? 擁有item=> item.name
?
我沒有掌握MVC,但我可以澄清你的第二個問題。
@Html.DisplayFor(modelItem => item.price)
那么這與MVC無關,如果你(真的)知道lambda表達式和匿名函數。 這里modelItem是參數,item.price是返回值。 想象一下將其翻譯為:
TypeOfPriceProp AnonymousFunction(SomeType modelItem) {
return item.price;
}
現在,如果您直接調用此函數,則此函數將無效,因為它不知道項目 。 但是,lambda表達式使它成為可能,因為它們也可以引用外部作用域中的變量。 這里的外部范圍是@foreach (var item in Model)
,它定義了item 。
簡而言之,你可以說在@Html.DisplayFor(modelItem => item.price)
根本沒有使用modelItem參數(也不需要聲明它。感謝lambda)。 實際上,如果您將item.price更改為modelItem.price,則無效。
如果你在msdn上查看這兩個方法的定義,你會發現它們是HTMLHelper類的擴展方法。 所以,這些方法都知道“模型”。 此輔助方法需要將lambda表達式作為參數。
以下是Expression<TDelegate>
類,它代表一個委托。 在這個特殊情況下,代表是
Func<TModel, TValue>
TModel是輸入參數,在這種情況下是“Model”類型。
現在,“模型”只不過是“模型”的一個實例,你可以將其命名為任何東西,它將以相同的方式工作。
您需要進一步閱讀匿名函數以完全理解它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.