В asp вспомогательных тегах, в чем разница между Model.PropertyName и просто PropertyName - PullRequest
0 голосов
/ 15 января 2020

Вот пример:

cs html >>

<label>List of products: </label>
<select asp-items="Model.ListOfProducts" asp-for="ProductToSearch">
    <option value="">All</option>
</select>

cs html .cs>

public class IndexModel : PageModel
{
   ...

    public SelectList ListOfProducts{get; set;}

    [BindProperty(SupportsGet=true)]
    public string ProductToSearch{get; set;} 
   ...
}

In cs html почему один называется Model.ListOfProducts, а другой называется просто ProductToSearch. Что делает Модель в этом случае?

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Это связано с фактическими типами для этих атрибутов в помощниках тегов. Например, атрибут asp-for поддерживается свойством класса вспомогательного тега, которое имеет тип ModelExpression. Таким образом, ожидается, что то, что вы передаете атрибуту в представлении, может быть интерпретировано как ModelExpression, то есть представление указанного c свойства на некотором уровне модели. В других случаях, таких как asp-items, типом является IEnumerable<SelectListItem>, поэтому ожидается, что вы передадите значение этого типа.

Проще говоря, синтаксис @Model.Property является разыменованием : вы извлекаете значение этого свойства, тогда как когда вы просто делаете Property, вы передаете выражение , представляющее это свойство.

Существует сценарий, который размывает линии немного: когда модель представляет собой список, и вы специально пытаетесь ссылаться на определенный элемент в этом списке как выражение. В этом случае что-то вроде [0].Property не является допустимым выражением, поэтому вы должны использовать @Model[0].Property.

1 голос
/ 15 января 2020

Список, который вы предоставляете для asp-items, потенциально может быть откуда-то извне модели, поэтому вам нужно указать полное пространство имен / путь к классу (или метод для создания объекта), который вы хотите использовать.

Принимая во внимание, что в asp-for ожидается, что вы всегда будете указывать свойство из текущей модели, поэтому нет необходимости добавлять к нему префикс.

...