如何将ASP-for TagHelper与反射结合使用

时间:2019-09-26 08:30:42

标签: c# asp.net-core razor asp.net-core-tag-helpers

我有一个 Foo 类,其中包含很多属性,我想将所有这些属性迭代为一种形式。该网站是使用ASP.NET Core 2.2和Razor构建的。

如何使用反射功能为TagHelper的asp生成一个MemberExpression?我已经在论坛上阅读了几篇关于此的文章,但没有一个答案符合我的需求。

以下代码段无效。

@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>
    }

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

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;}
}

呈现的形式是:

enter image description here

答案 1 :(得分:0)

  

右键单击解决方案->添加->新文件夹(模型)

     

右键单击“模型”文件夹->添加->类(Foo)

Foo类:

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>