循环查看视图中的模型属性
我有一个痛苦的简单视图模型
public class TellAFriendViewModel { public string Email1 { get; set; } public string Email2 { get; set; } public string Email3 { get; set; } public string Email4 { get; set; } public string Email5 { get; set; } }
然后我的视图上的相应输入,但我想知道是否有更好的方法(如循环)将类似的TextBoxs写入我的视图:
@using (Html.BeginForm()){ @Html.AntiForgeryToken() @Html.TextBoxFor(vm => vm.Email1) @Html.TextBoxFor(vm => vm.Email2) @Html.TextBoxFor(vm => vm.Email3) @Html.TextBoxFor(vm => vm.Email4) @Html.TextBoxFor(vm => vm.Email5) }
你应该访问
ViewData.ModelMetadata.Properties
。 没有理由加倍reflection工作,加上它为您计算出DataAttributes元数据。
@foreach(var property in ViewData.ModelMetadata.Properties) { @Html.Editor(property.PropertyName) }
你应该考虑使用一个数组。
但是, 如果你想使用reflection,它将如下所示:
@foreach (var prop in Model.GetType().GetProperties()) { @(Html.TextBox(prop.Name, prop.GetValue(Model, null))) }
除非我遗漏了什么,否则我不知道为什么没有人提出这个建议。 为什么每个人都循环和/或使用reflection?
public class TellAFriendViewModel { public ICollection Emails { get; set; } // populate 5 of them in ctor or controller } public class EmailViewModel { public string Email { get; set; } }
视图:
@using (Html.BeginForm()){ @Html.AntiForgeryToken() @Html.EditorFor(model => model.Emails) }
EditorTemplates \ EmailViewModel.cshtml
@Html.TextBoxFor(model => model.Email)
在MVC中永远不需要循环。 我重复。 决不
这是可以接受的方式
foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => !pm.HideSurroundingHtml && pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm))) { @Html.Editor(prop.PropertyName) @Html.ValidationMessage(prop.PropertyName, new {@class = "help-block"})
}
您可以使用Reflection来遍历模型的每个属性……如下所示
Type type = Model.GetType(); // Model is the object you are binding with in your view PropertyInfo[] properties = type.GetProperties(); foreach (var property in properties) { // Code to create your text box for the property }
希望这可以帮助…
您可以对属性使用reflection,或使用简单的for循环生成与解决方案中生成的HTML相同的HTML,但您的目标是什么?
为简单起见,您获胜的是什么。
reflection
foreach (var prop in typeof(whatever).GetProperties(BindingFlags.Instance | BindingFlags.Public)) { @Html.TextBox(prop.Name, prop.GetValue(Model)); }
环
var numberProperties = 5; // you could also do typeof(whatever).GetProperties(BindingFlags.Instance | BindingFlags.Public).Count(); @for(var i = 0; i < numberProperties; i++){ }
也许是这样的?
public class TellAFriendViewModel { List Emails { get; set; } public TellAFriendViewModel() { Emails = new List (5); } } @using (Html.BeginForm()){ @Html.AntiForgeryToken() @for(int count = 0 ; count < model.Emails.Count; count++) { @Html.TextBoxFor(vm => vm.Emails[count]) } }