#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
затем использует отражение для получения соответствующего отображаемого имени.