遍历 GetType().GetProperties() 并将每个 属性 与 asp-for (Razor Pages) 绑定
Loop through GetType().GetProperties() and bind each property with asp-for (Razor Pages)
我刚发现居然还有GetType().GetProperties(),这样可以用吗?
目标是使用循环获取特定实体的所有属性,而不必对 HTML 中的每个 属性 进行硬编码,更新每个已编辑的 属性 并保存新的在 [BindProperty] 注释的帮助下在 OnPost 中获取信息。
我无法正确绑定 asp-for taghelper。
<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.
如果我在标签内使用 value="@prop.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 、 name 和输入值。
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>
我刚发现居然还有GetType().GetProperties(),这样可以用吗?
目标是使用循环获取特定实体的所有属性,而不必对 HTML 中的每个 属性 进行硬编码,更新每个已编辑的 属性 并保存新的在 [BindProperty] 注释的帮助下在 OnPost 中获取信息。 我无法正确绑定 asp-for taghelper。
<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.
如果我在标签内使用 value="@prop.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 、 name 和输入值。
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>