【问题标题】:Bind a Variable to the asp-for tag inside of loop将变量绑定到循环内的 asp-for 标记
【发布时间】:2019-11-30 02:24:27
【问题描述】:

我有一类人和爱好

public class PersonViewModel
{
    public string Name { get; set; }
    public string Email { get; set; }
    public List<Hobby> Hobbies { get; set; }
}

public class Hobby
{
    public string Name { get; set; }
    public string Type { get; set; }
    public string Frequency { get; set; }
    public string SomethingElse { get; set; }
}

在我的网页上,我想循环访问 Hobby 中的属性以生成表格。 这个想法是,如果我更改类,显示/请求的数据将自动更改。

目前在我的网页上

@if (Model.Hobbies.Count>0)
{

<table>
    <thead>
        <tr>
            <td>&nbsp;</td><td>Hobby 01</td><td>Hobby 02</td><td>Hobby 03</td><td>Hobby 04</td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Frequency</td>
            @for (int i =0; i < Model.Hobbies.Count; i++)
            {
            <td><input type="text"  class="form-control" id="Hobbies[i].Frequency" asp-for="Hobbies[i].Frequency" value="">  </td>
            }

        </tr>
        @foreach(var property in Model.Hobbies[0].GetType().GetProperties())
        {
        <tr>
            <td><label>@property.Name</label></td>
            @for (int i =0; i < Model.Hobbies.Count; i++)
            {
            <td>sds <input type="text"  class="form-control" id="Hobbies[i].@property.Name" asp-for="Hobbies[i].GetProperty(property.Name)" value="">  </td>
            }
        </tr>
            }
    </tbody>
</table>
}

第一个 asp-for,我使用的名称工作正常

 asp-for="Hobbies[i].Frequency"

但是我不能让第二个使用变量来工作:

 asp-for="Hobbies[i].property.Name"

- 我尝试了很多方法,我确信有一种方法我可以使用我只是不知道它是什么。

任何帮助都会很棒。

【问题讨论】:

  • 这个link解决了你的问题的一个例子
  • asp-for 需要一个模型 表达式,因此您不能传递需要执行的东西(尤其是通过反射)。

标签: c# asp.net-core razor asp.net-core-mvc


【解决方案1】:

正如 poke 在评论中所说,asp-for 需要一个模型表达式

input 标签助手中的asp-for 属性为asp-for 属性中指定的表达式名称生成idname HTML 属性。 asp-for="Property1.Property2" 等价于 m =&gt; m.Property1.Property2。表达式的名称用于 asp-for 属性值。

您可以自定义一个标签助手,它设置来自视图中asp-for-model 属性和asp-for-prop 属性的输入的id、名称和值。这种解决方法可能并不聪明,但它可以解决您的问题。

这是工作代码:

  • 条件标签助手

    [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 Hobby { get; set; }
    
    
      public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        var propName = Property.ModelExplorer.Model.ToString();
        var modelName = Hobby.Name.ToString();
        var modelExProp = Hobby.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 中,添加与 类中使用的命名空间。

    @addTagHelper *, MVCTest
    
  • 景色

    @foreach (var property in Model.Hobbies[0].GetType().GetProperties())
        {
            <tr>
                <td><label>@property.Name</label></td>
                @for (int i = 0; i < Model.Hobbies.Count; i++)
                {
                    <td>sds <input type="text" class="form-control" asp-for-model="@Model.Hobbies[i]"  asp-for-prop="@property.Name"/>  </td>
                }
           </tr>
        }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-06
    • 2021-04-08
    • 2017-05-05
    • 1970-01-01
    • 2018-09-18
    • 2021-09-10
    • 2018-10-04
    • 1970-01-01
    相关资源
    最近更新 更多