Помощник по тегам Razor — привязка к коллекции

#c# #asp.net-core #tag-helpers #asp.net-core-tag-helpers

#c# #asp.net-ядро #помощники тегов #asp.net-core-tag-helpers

Вопрос:

Использование ASP.NET Ядро 2.2 Я пытаюсь создать помощник по тегам, который будет привязываться к a 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. Вы пытались изменить имя свойства с AspFor на что-то вроде public ModelExpression For { get; set; } ?

Ответ №1:

Ответ был, в конце концов, очень простым — поскольку я знаю тип выражения, я могу просто 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);
}