2015-09-21 3 views
3

Привет, я создал View, используя шаблон Visual Studio, который должен отображать список объектов. Вот сгенерированный синтаксис Visual Studio:Понимание списка объектов на основе Синтаксис представления ASP.NET MVC

@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? Что делает model (с малым м) означает выше? Как IDE знает, что существует model.name (с небольшим m).

Если Model.Name будет использоваться это означало бы, что IEnumerable имеет свойство Name (верно?), Но это не так, не так ли? Объяснение для чайников оценено. Так что же действительно model (с малым м)?

2) Наконец это:

@Html.DisplayFor(modelItem => item.name) 

также сбивает с толку. что такое modelItem - он не был объявлен нигде? Откуда это появилось? Как это работает? не логичнее было бы item=> item.name?

+0

Модель и modelItem, используемые здесь, являются только именем параметра для ваших лямбда-функций. Вы даже можете назвать его так или иначе, как m или mitem. Просто найдите некоторую информацию о лямбда-выражениях в google. – Thangadurai

+1

@Thangadurai: Если я могу что-то написать, как он здесь знает: 'model => model.available', что' model.available' - свойство существует ?? Твое объяснение действительно слишком мало, я делал фундаментальные исследования, прежде чем спрашивать. –

+0

Отправьте свой модельный объект здесь. Для вашей информации метод расширения DisplayNameFor на самом деле ожидает IEnumerable. Вам действительно нужно немного поработать над Google Data Annotations, расширениями методов и проверить синтаксис этих HTML-помощников в MSDN. – Thangadurai

ответ

-1

Если вы посмотрите на определения этих двух методов на msdn, вы обнаружите, что они являются методами расширения для класса HTMLHelper. Итак, эти методы знают о «Модели». Этот вспомогательный метод ожидает выражение лямбда как параметр.

Что представляет собой Expression<TDelegate> класс, и он представляет делегата. В данном конкретном случае делегат

Func<TModel, TValue>

TModel является входным параметром, который имеет тип «Модель» в данном случае.

Теперь «модель» - это не что иное, как пример «модели», вы можете назвать ее чем угодно, и она будет работать одинаково.

Вам необходимо прочитать некоторые анонимные функции, чтобы понять их полностью.

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

+0

если 'model' является экземпляром' Model' - тогда 'Model' имеет тип' IEnumerable' справа? Как получилось, что 'IEnumerable' имеет такие свойства, как' available' ??? PS. Также вы уверены, что если я использую внутри html 'model', я не получу синтаксическую ошибку? (с малым m)?! –

+0

Вы можете посмотреть здесь - https://gist.github.com/rally25rs/1379767 –

+0

@ user30044, люди стараются изо всех сил, чтобы обеспечить лучшие ответы. Ваш «тон» не подходит для такого форума. Я не вижу ничего плохого в этом ответе – Thangadurai

0

У меня нет руки на MVC, но я могу уточнить свой 2-й вопрос.

@Html.DisplayFor(modelItem => item.price) 

Ну, это не имеет никакого отношения к MVC, если вы (действительно) знаете выражение лямбда и анонимные функции. Здесь modelItem - параметр и item.price - возвращаемое значение. Представьте себе, переводя это:

TypeOfPriceProp AnonymousFunction(SomeType modelItem) { 
    return item.price; 
} 

Теперь эта функция не будет работать, если вы назвали его напрямую, потому что он не знает о пункт. Тем не менее, лямбда-выражения делают это возможным, потому что они также могут ссылаться на переменные из внешней области.Внешняя область здесь @foreach (var item in Model), которая определяет item.

Одним словом, вы можете сказать, что в параметре @Html.DisplayFor(modelItem => item.price) modelItem не используется вообще (его также не нужно объявлять. Благодаря лямбда). Фактически, если вы изменили этот item.price на modelItem.price, это не сработает.

+0

ok Я думаю, что я понимаю объяснение для второго вопроса - спасибо. Но первый вопрос все еще остается неясным! –

+0

Да, ваш первый вопрос действительно интересен. И что-то запуталось из-за этого IEnumerable. :) – niksofteng

+0

Да, но как вы можете видеть, никто до сих пор не ответил?! Я не знаю, как увеличить внимание к этому вопросу. –

Смежные вопросы