Почему в сгенерированном DataBaseManagerController заголовок таблицы генерируется с использованием лямбда-выражения в ASP MVC 4

#c# #html #asp.net-mvc #linq #lambda

#c# #HTML #asp.net-mvc #linq #лямбда

Вопрос:

Я сгенерировал StoreManagerController для своего решения. Visual Studio 2013 сгенерировала такие StoreManager/Index.cshtml view

 @model IEnumerable<MvcMusicStore.Models.Album>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Genre.Name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Artist.Name)
        </th>
        <th>
           @* @Html.DisplayNameFor(model => model.Title)*@
            TITLE
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Price)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Genre.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Artist.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Price)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.AlbumId }) |
            @Html.ActionLink("Details", "Details", new { id=item.AlbumId }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.AlbumId })
        </td>
    </tr>
}

</table>
 

Вопросы:

1. Почему заголовок таблицы генерируется с помощью : @Html.DisplayNameFor(model => model.Title) не просто Title или, по крайней мере @Html.DisplayNameFor(model.Title) .

2.Is DisplayNameFor метод возвращает имя поля, поэтому для model => model.x он возвращает x? Это что-то вроде отражения в Java?

3.Is здесь необходимо лямбда-выражение?

Результат: введите описание изображения здесь

Ответ №1:

Все ваши вопросы в основном являются вариациями одного и того же. DisplayNameFor используется для возврата пользовательского имени свойства. В самых простых сценариях он просто вернет само имя свойства, которое не будет работать без фактического указания имени свойства в выражении, поэтому разумно спросить: «Почему бы просто не ввести жесткий код имени». Реальная выгода приходит, когда вы указываете отображаемое имя для свойства, добавляя что-то вроде:

 [Display(Name = "My Awesome Title")]
public string Title { get; set; }
 

Теперь он возвращает «My Awesome Title» вместо «Title», и если вы позже решите изменить это отображаемое имя на «My Super Awesome Title», вы меняете его только один раз, и везде, где вы использовали DisplayNameFor , значение обновляется автоматически.

Выражение необходимо по причине более низкого уровня. Если вы только что передали model.Title , то будет передано значение свойства. Выражение служит для передачи самого свойства, которое DisplayNameFor затем использует отражение для получения соответствующего отображаемого имени.