C# 使用标记帮助器或html帮助器为对象列表生成输入

C# 使用标记帮助器或html帮助器为对象列表生成输入,c#,asp.net-core,asp.net-core-tag-helpers,C#,Asp.net Core,Asp.net Core Tag Helpers,这是我的模特电影 class Movie { public int Id { get; set; } public string Title { get; set; } public List<Country> Countries { get; set; } public List<Actor> Cast { get; set; } public List<Genre> Genres { get; set; } } 我

这是我的模特电影

class Movie
{
    public int Id { get; set; }
    public string Title { get; set; }
    public List<Country> Countries { get; set; }
    public List<Actor> Cast { get; set; }
    public List<Genre> Genres { get; set; }
}
我向一些Api发送请求并填充movie对象,然后将其直接发送到view CreateMovie。CreateMovie视图有一个用电影数据填充的表单

问题:我需要将为集合类型(如countries属性)创建输入的逻辑封装到标记帮助器或html帮助器中

如何将此代码转换为标记帮助器或html帮助器

@if(Model.Countries != null && Model.Countries.Any())
{
    for (var index = 0; index < Model.Countries.Count; index++)
    {
        <div>
            <label asp-for="@Model.Countries[index].Name"></label>
            <input asp-for="@Model.Countries[index].Name"/>
        </div>
    }
}
@if(Model.Countries!=null&&Model.Countries.Any())
{
对于(var指数=0;指数
现在,我正在使用这段代码将逻辑封装到html帮助程序中

public static class HtmlHelperExtensions
{
    public static IHtmlContent EditorFor<T>(this IHtmlHelper htmlHelper, List<T> source, string listName, string listItemProperty)

    {
        if (source != null && source.Any())
        {
            var property = typeof(T).GetProperties().Single(p => p.Name == listItemProperty);
            StringBuilder result = new StringBuilder();
            for (int i = 0; i < source.Count; i++)
            {
                var content =
                    $"<input name=\"{listName}[{i}].{listItemProperty}\" value=\"{property.GetValue(source[i])}\" type=\"text\" />";

                result.Append(content);
            }

            return new HtmlString(result.ToString());
        }
        return new HtmlString("");
    }
}
公共静态类HtmlHelperExtensions
{
公共静态IHtmlContent编辑器(此IHtmlHelper、列表源、字符串listName、字符串listItemProperty)
{
if(source!=null&&source.Any())
{
var property=typeof(T).GetProperties().Single(p=>p.Name==listItemProperty);
StringBuilder结果=新建StringBuilder();
for(int i=0;i
您应该解释当前尝试不起作用的原因。@StephenMuecke我当前的解决方案起作用了。但我有很多属性是复杂对象的集合,比如“国家”。我正在尝试创建泛型和强类型方法来封装逻辑,以便我可以将其用于其他视图,并保持我的视图干净。抱歉,说得太苛刻了,但是您的代码不理解如何创建
HtmlHelper
扩展方法,以及为什么使用它们。还不太清楚您想要用它实现什么(您只需要为集合的一个属性创建一个输入)。我建议您首先研究现有
HtmlHelper
方法的源代码。如果您试图生成集合属性的表格布局以供显示和/或编辑,您可能会感兴趣。虽然我使用
@Html.TableDisplayFor()
方法编写了文档,但我还没有添加任何文档。@StephenMuecke感谢您的回复。这几乎是我所需要的。你应该解释为什么你目前的尝试不起作用。@StephenMuecke我目前的解决方案起作用了。但我有很多属性是复杂对象的集合,比如“国家”。我正在尝试创建泛型和强类型方法来封装逻辑,以便我可以将其用于其他视图,并保持我的视图干净。抱歉,说得太苛刻了,但是您的代码不理解如何创建
HtmlHelper
扩展方法,以及为什么使用它们。还不太清楚您想要用它实现什么(您只需要为集合的一个属性创建一个输入)。我建议您首先研究现有
HtmlHelper
方法的源代码。如果您试图生成集合属性的表格布局以供显示和/或编辑,您可能会感兴趣。虽然我使用
@Html.TableDisplayFor()
方法编写了文档,但我还没有添加任何文档。@StephenMuecke感谢您的回复。这几乎是我所需要的。
public static class HtmlHelperExtensions
{
    public static IHtmlContent EditorFor<T>(this IHtmlHelper htmlHelper, List<T> source, string listName, string listItemProperty)

    {
        if (source != null && source.Any())
        {
            var property = typeof(T).GetProperties().Single(p => p.Name == listItemProperty);
            StringBuilder result = new StringBuilder();
            for (int i = 0; i < source.Count; i++)
            {
                var content =
                    $"<input name=\"{listName}[{i}].{listItemProperty}\" value=\"{property.GetValue(source[i])}\" type=\"text\" />";

                result.Append(content);
            }

            return new HtmlString(result.ToString());
        }
        return new HtmlString("");
    }
}