簡體   English   中英

理解基於View MVL的對象列表

[英]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”類型。

現在,“模型”只不過是“模型”的一個實例,你可以將其命名為任何東西,它將以相同的方式工作。

您需要進一步閱讀匿名函數以完全理解它。

https://msdn.microsoft.com/en-us/library/bb397687.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM