循环执行GetType().GetProperties()并将每个属性与(Razor Pages)的asp绑定



我刚刚发现GetType((.GetProperties((甚至存在,有可能用这种方式吗?

目标是使用循环获取特定实体上的所有属性,而不必对HTML中的每个属性进行硬编码,更新每个编辑过的属性,并在[BindProperty]注释的帮助下将新信息保存在OnPost中。我无法正确绑定标签助手的asp。

<form method="post">
@foreach (var prop in Model.Product.GetType().GetProperties())
{
<label asp-for="@prop.Name"></label>
<input asp-for="@prop.GetValue(Model.Product)" class="form-control" />
}
<button type="submit" class="btn btn-primary">Update</button>
</form>

运行此代码会出现以下异常:

InvalidOperationException: Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.

如果我使用值="0"@道具GetValue(Model.Product(";在标签中,我在加载编辑页面时正确地获得了信息。但是在提交表单时,我不会得到以前输入的新值。

这是模型页面中的模型

[BindProperty]
public ProductModel? Product { get; set; }
OnGet()
{
Product = db.GetProduct(id);
}

谢谢你花时间阅读这篇文章!

Tag Helper帮助我们以声明式编程的风格编写代码。当您发现很难通过反射动态渲染不同的字段时,请尝试使用Html helper作为替代方法。

如果您只想在不设置值的情况下渲染输入。Html Helper运行良好。但你似乎也想为输入设置值,我尝试了以下方法,但在asp.net核心3.x:中没有意义

@Html.Editor(prop.Name, new { htmlAttributes = new { @class = "form-control",@Value=prop.GetValue(Model.Product)} })

因此,我建议您可以自定义一个标记助手,它可以设置视图中asp-for-model属性和asp-for-prop属性的输入的id、名称和值。

ConditionTagHelper:

namespace AuthoringTagHelpers.TagHelpers
{
[HtmlTargetElement("input", Attributes = "asp-for-prop")]
public class ConditionTagHelper : TagHelper
{
[HtmlAttributeName("asp-for-prop")]
public ModelExpression Property { get; set; }
[HtmlAttributeName("asp-for-model")]
public ModelExpression Model { get; set; }

public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
var propName = Property.ModelExplorer.Model.ToString();
var modelName = Model.Name.ToString();
var modelExProp = Model.ModelExplorer.Properties.Single(x => x.Metadata.PropertyName.Equals(propName));
var propValue = modelExProp.Model;
var para = modelName + "." + propName;
output.Attributes.Add("id", para);
output.Attributes.Add("name", para);
output.Attributes.Add("value", propValue);
base.Process(context, output);
}
}
}

在_viewImports.cshtml中,:

@addTagHelper *, AuthoringTagHelpers   //AuthoringTagHelpers depends on your project name

注意@addTagHelper之后的第一个字符串指定要加载的标记助手(对所有标记助手使用"*"(,第二个字符串AuthoringTagHelpers指定标记助手所在的程序集。

页码:

<form method="post">
@foreach (var prop in Model.Product.GetType().GetProperties())
{
@Html.Label(prop.Name)
<input asp-for-model="@Model.Product" asp-for-prop="@prop.Name" class="form-control" />
}
<button type="submit" class="btn btn-primary">Update</button>
</form>

最新更新