使用标记帮助程序或html帮助程序为对象列表生成输入

时间:2017-08-19 14:06:33

标签: 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; }
}

这是国家模型

public class Country
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我向一些Api发送请求并填充电影对象,然后将其直接发送到视图 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>
    }
}

现在,我正在使用此代码将逻辑封装到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("");
    }
}

0 个答案:

没有答案