簡體   English   中英

在循環內將變量綁定到asp-for標簽

[英]Bind a Variable to the asp-for tag inside of loop

我有一類人和愛好

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中的屬性以生成一個表。 這個想法是,如果我更改了Class,則顯示/請求的數據將自動更改。

目前在網頁上

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

我使用名稱的第一個as-for效果很好

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

但是我無法使用變量來使第二個工作:

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

-我嘗試了多種方法,但我肯定有一種方法可以使用,只是不知道它是什么。

任何幫助都會很棒。

正如poke在評論中所說, asp-for需要模型表達式

asp-for在屬性input標簽輔助生成idname為在asp-為屬性指定的表達式名稱HTML屬性。 asp-for="Property1.Property2"等效於m => m.Property1.Property2 表達式的名稱是用於as-for屬性值的名稱。

您可以自定義標簽幫助程序,該標簽幫助程序在視圖中的asp-for-model屬性和asp-for-prop屬性中設置輸入的id,名稱和值。 此解決方法可能並不明智,但可以解決您的問題。

這是工作代碼:

  • ConditionTagHelper

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM