【问题标题】:How to use asp-for TagHelper combined with Reflection如何使用 asp-for TagHelper 结合反射
【发布时间】:2020-01-26 11:40:36
【问题描述】:

我有一个 Foo 类,它包含很多属性,我想将它们全部迭代成一个表单。该网站是使用 ASP.NET Core 2.2 和 Razor 构建的。

如何使用反射构建 asp-for TagHelper 似乎期望的 MemberExpression?我在论坛上阅读了几篇关于此的帖子,但没有一个答案符合我的需要。

下面的 sn-p 不起作用。

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

感谢您的帮助

【问题讨论】:

  • 您是否从 Foo 类创建(并填充)实例?
  • Foo 实例是通过视图模型传递的。我将更新示例。

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


【解决方案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;}
}

呈现出来的形式是:

【讨论】:

  • 这行得通,谢谢,我不知道它是等价的。但是,我仍然面临一个问题(我没有在我的问题中公开),我如何枚举和填充子对象 NestedFoo 的字段?当我从 Foo 枚举所有属性时,正确考虑了嵌套对象,但是如果我只想通过反射从子对象中获取属性,那么语法是什么?感谢您的帮助。
  • @XavierAM 这可以通过递归使用局部视图来完成:)
【解决方案2】:

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

右击模型文件夹-->添加-->类(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>

【讨论】:

  • 嗯。这对我不起作用...我得到: 而标签只写Name
  • 将 Foo.cs 添加到模型文件夹是什么意思?
  • imagevisit.com/image/bDQE1 您必须添加新文件夹(模型)您的解决方案,并将新类(Foo)添加到模型文件夹。
  • 我认为这与问题无关。将一个类从一个文件夹移动到另一个文件夹不会改变对这个类的reference
  • 在 github 上分享您的问题示例并在此处输入链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 2018-09-28
  • 2020-12-08
  • 1970-01-01
相关资源
最近更新 更多