[英]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> </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
標簽輔助生成id
和name
為在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.