Razor Tag Helper - Привязка к коллекции - PullRequest
0 голосов
/ 12 апреля 2019

Использование ASP.NET Core 2.2 Я пытаюсь создать Tag Helper , который будет привязан к ModelExpression, представляющему коллекцию SelectListItems , Затем я хочу получить доступ к итерациям по SelectListItems, содержащемуся в списке.

В коде это выглядит примерно так ...

[HtmlTargetElement("check-box-list", Attributes = "asp-for)]
public class CheckboxListTagHelper : TagHelper
{
    // Where the model is an IEnumerable<SelectItemList>
    [HtmlAttributeName("asp-for")]
    public ModelExpression AspFor { get; set; }

    public override async Task ProcessAsync(
        TagHelperContext context, TagHelperOutput output)
    {
        // I want to be able to reference the IEnumerable<SelectListItem>
        // represented by the model
        var modelItems = AspFor.Model as IEnumerable<SelectListItem>; // WRONG!
        ...
    }
}

Полагаю, мне нужно использовать свойства ModelExpression.MetaData или ModelExpression.ModelExpolorer, но я не могу найти информацию, которая указывает мне правильное направление.

Неуравновешенное исправление - предоставить ту же модель в качестве дополнительного свойства:

[HtmlAttributeName("select-item-list")]
public IEnumerable<SelectListItem> SelectItemList { get; set; }

Но это выглядит грязно в представлении:

<check-box-list
    asp-for="SelectedAuthorityLevels"
    checkbox-list="Model.SelectedAuthorityLevels" />

, поскольку вы дважды привязываете к одному и тому же свойству модели.

Любое руководство будет высоко ценится.

1 Ответ

0 голосов
/ 14 апреля 2019

В конце концов, ответ был очень прост - поскольку я знаю тип выражения, я могу просто cast сделать его следующим образом:

var selectList = AspFor.Model as IEnumerable<SelectListItem>;

if (selectList == null) {
   var msg = "CheckboxList tag helper attribute 'asp-for' must of type " +
      "IEnumerable<Microsoft.AspNetCore.Mvc.Rendering.SelectListItem>!";
   throw new Exception(msg);
}
...