循环查看视图中的模型属性

我有一个痛苦的简单视图模型

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]) } }