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("");
}
}