#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);
}