如何使用asp-for TagHelper结合Reflection
How to use asp-for TagHelper combined with Reflection
我有一个 class Foo ,其中包含很多属性,我想将所有属性迭代到一个表单中。该网站是使用 ASP.NET Core 2.2 和 Razor 构建的。
如何构建一个 asp-for TagHelper 似乎期望使用反射的 MemberExpression?我在论坛上阅读了一些关于此的 post,但 none 的答案符合我的需要。
以下代码段无效。
@model Foo;
<h1>Foo Reflective filling example</h1>
@foreach(var property in typeof(Foo).GetProperties()) {
<p>
<div class="row">
<div class="col-md-3">
<label asp-for="@property.Name"></label> @*doesn't work!'*@
</div>
<div class="col-md-3">
<input asp-for="@property.Name" class="form-control" id="property.Name"/>
<span asp-validation-for="@property.Name" class="text-danger"></span>
</div>
</div>
</p>
}
感谢您的帮助
Right click to solution --> Add --> New Folder(Models)
Right click to Models folder --> Add --> Class(Foo)
富 class:
public class Foo
{
public int A { get; set; }
public string B { get; set; }
}
Index.cshtml 文件:
@foreach (var property in typeof(YourProjectName.Models.Foo).GetProperties())
{
<p>
<div class="row">
<div class="col-md-3">
<label asp-for="@property.Name"></label>
</div>
<div class="col-md-3">
<input asp-for="@property.Name" class="form-control" id="property.Name" />
<span asp-validation-for="@property.Name" class="text-danger"></span>
</div>
</div>
</p>
}
结果:
<body>
<p>
<div class="row">
<div class="col-md-3">
<label asp-for="A"></label>
</div>
<div class="col-md-3">
<input class="form-control" id="property.Name" asp-for="A">
<span class="text-danger" asp-validation-for="A"></span>
</div>
</div>
<p></p>
<p>
<div class="row">
<div class="col-md-3">
<label asp-for="B"></label>
</div>
<div class="col-md-3">
<input class="form-control" id="property.Name" asp-for="B">
<span class="text-danger" asp-validation-for="B"></span>
</div>
</div>
<p></p>
</body>
InputTagHelper 帮助我们以声明式 编程风格编写代码。当您发现难以通过反射动态呈现不同的字段时,请随意使用 @Html.Xyz
等价物 程序化 方式。
您的代码可以重写如下:
@foreach(var property in typeof(Foo).GetProperties()) {
<p>
<div class="row" >
<div class="col-md-3">
@Html.Label(@property.Name)
</div>
<div class="col-md-3">
@Html.Editor(@property.Name, new { htmlAttributes = new{ @class="form-control" } })
@Html.ValidationMessage(@property.Name, new { htmlAttributes = new { @class="text-danger"} })
</div>
</div>
</p>
}
演示:
我创建了一个自定义 Foo DTO,如下所示:
public class Foo{
public int Id {get;set;}
public string Name {get;set;}
public string Address {get;set;}
public DateTime UpdatedAt{get;set;}
}
呈现的形式是:
我有一个 class Foo ,其中包含很多属性,我想将所有属性迭代到一个表单中。该网站是使用 ASP.NET Core 2.2 和 Razor 构建的。
如何构建一个 asp-for TagHelper 似乎期望使用反射的 MemberExpression?我在论坛上阅读了一些关于此的 post,但 none 的答案符合我的需要。
以下代码段无效。
@model Foo;
<h1>Foo Reflective filling example</h1>
@foreach(var property in typeof(Foo).GetProperties()) {
<p>
<div class="row">
<div class="col-md-3">
<label asp-for="@property.Name"></label> @*doesn't work!'*@
</div>
<div class="col-md-3">
<input asp-for="@property.Name" class="form-control" id="property.Name"/>
<span asp-validation-for="@property.Name" class="text-danger"></span>
</div>
</div>
</p>
}
感谢您的帮助
Right click to solution --> Add --> New Folder(Models)
Right click to Models folder --> Add --> Class(Foo)
富 class:
public class Foo
{
public int A { get; set; }
public string B { get; set; }
}
Index.cshtml 文件:
@foreach (var property in typeof(YourProjectName.Models.Foo).GetProperties())
{
<p>
<div class="row">
<div class="col-md-3">
<label asp-for="@property.Name"></label>
</div>
<div class="col-md-3">
<input asp-for="@property.Name" class="form-control" id="property.Name" />
<span asp-validation-for="@property.Name" class="text-danger"></span>
</div>
</div>
</p>
}
结果:
<body>
<p>
<div class="row">
<div class="col-md-3">
<label asp-for="A"></label>
</div>
<div class="col-md-3">
<input class="form-control" id="property.Name" asp-for="A">
<span class="text-danger" asp-validation-for="A"></span>
</div>
</div>
<p></p>
<p>
<div class="row">
<div class="col-md-3">
<label asp-for="B"></label>
</div>
<div class="col-md-3">
<input class="form-control" id="property.Name" asp-for="B">
<span class="text-danger" asp-validation-for="B"></span>
</div>
</div>
<p></p>
</body>
InputTagHelper 帮助我们以声明式 编程风格编写代码。当您发现难以通过反射动态呈现不同的字段时,请随意使用 @Html.Xyz
等价物 程序化 方式。
您的代码可以重写如下:
@foreach(var property in typeof(Foo).GetProperties()) {
<p>
<div class="row" >
<div class="col-md-3">
@Html.Label(@property.Name)
</div>
<div class="col-md-3">
@Html.Editor(@property.Name, new { htmlAttributes = new{ @class="form-control" } })
@Html.ValidationMessage(@property.Name, new { htmlAttributes = new { @class="text-danger"} })
</div>
</div>
</p>
}
演示:
我创建了一个自定义 Foo DTO,如下所示:
public class Foo{
public int Id {get;set;}
public string Name {get;set;}
public string Address {get;set;}
public DateTime UpdatedAt{get;set;}
}
呈现的形式是: