2012-03-28 16 views
22

Tengo un modelo simple vista dolorosamenteRetransmisión de propiedades vista del modelo en una vista

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

Y luego las entradas correspondientes en mi opinión, pero me pregunto si hay una manera mejor (tal como un bucle) para escribir cuadros de texto similares a mi modo de ver:

@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) 
} 
+2

También podría considerar la condensación de su entrada a una matriz de direcciones de correo electrónico y expansión dinámica en el cliente o enlace a una iteración preestablecido en el código de afeitar.'public string [] Emails ...' etc. –

Respuesta

32

debe acceder

ViewData.ModelMetadata.Properties. No hay razón para duplicar el esfuerzo de reflexión, además de que se da cuenta de los metadatos de DataAttributes por usted.

@foreach(var property in ViewData.ModelMetadata.Properties) 
{ 
    <div class="editor-line"> 
     <label>@(property.DisplayName??property.PropertyName)</label> 
     @Html.Editor(property.PropertyName) 
    </div> 
} 
+0

Esto funcionó perfectamente, gracias. –

+0

tenía una pregunta aquí, ¿qué es conveniente utilizando foreach propertyinfo o por uso (igual que el código de pregunta) propiedad individual de forma manual? y si el ciclo foreach de lo que tengo dudas puede aumentar el costo de ejecución/proceso. – asharajay

+0

2 preguntas: ¿hay alguna manera de determinar el orden de las propiedades? ¿Y cuáles son esas dos marcas de interrogación property.DisplayName? Property.PropertyName –

0

que podía utilizar la reflexión sobre las propiedades, o un simple bucle for para generar la misma HTML como se genera en su solución, pero ¿cuál es su objetivo?
Para simplificar, lo que tiene gana.

Reflexión

foreach (var prop in typeof(whatever).GetProperties(BindingFlags.Instance | BindingFlags.Public)) 
{ 
    @Html.TextBox(prop.Name, prop.GetValue(Model)); 
} 

Loop

var numberProperties = 5; // you could also do typeof(whatever).GetProperties(BindingFlags.Instance | BindingFlags.Public).Count(); 
@for(var i = 0; i < numberProperties; i++){ 
<input type="text" name="[email protected]" id="[email protected]"/> 
} 
+0

Tengo curiosidad de cómo recorrer el modelo para mostrarlos. En este caso, probablemente me quede con lo que se proporciona, pero digamos que tengo 90 entradas de correo electrónico, probablemente no me gustaría escribirlas. –

+0

@NickBrown Si tenía 90 correos electrónicos y estaba perpetuando el diseño en su lugar, es posible que desee consultar a alguien para ayudarlo a solucionarlo, o simplemente vaya con un diseño de matriz para comenzar. –

10

debe considerar el uso de una matriz.

Sin embargo, si quería ir con la reflexión, que se vería así:

@foreach (var prop in Model.GetType().GetProperties()) 
{ 
    @(Html.TextBox(prop.Name, prop.GetValue(Model, null))) 
} 
+0

Su sintaxis para 'PropertyInfo.GetValue' es incorrecta. ¿'Model.GetType' no funciona en Razor? Si lo hace, generalmente sería preferible. –

+1

Tienes razón. (la sintaxis anterior funciona en .NET 4.5 a medida que se introduce una nueva sobrecarga de 'GetValue') –

+0

¿De verdad? Empecé a retocar en 4.5 y principalmente con el código 4 heredado, así que es bueno saber que puedo eliminar mi método de extensión una vez que se publique. –

0

Puede utilizar la reflexión para recorrer cada propiedad de su modelo ... como a continuación

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 
} 

Espero que esto ayude ...

+1

Esta sintaxis no funcionaría en una vista Razor (o _any_ really). –

+0

@ M.Babcock jaja ... lo siento mal ... gracias por señalar ... – NiK

0

¿Le gusta tal?

public class TellAFriendViewModel 
{ 
List<string> Emails { get; set; } 

public TellAFriendViewModel() 
{ 
    Emails = new List<string>(5); 
} 
} 

@using (Html.BeginForm()){ 
@Html.AntiForgeryToken() 

@for(int count = 0 ; count < model.Emails.Count; count++) 
{ 
    @Html.TextBoxFor(vm => vm.Emails[count]) 
} 
} 
3

A menos que me esté perdiendo algo, no sé por qué nadie ha sugerido esto. ¿Por qué todos buchan y/o utilizan la reflexión?

public class TellAFriendViewModel 
{ 
    public ICollection<EmailViewModel> Emails { get; set; } // populate 5 of them in ctor or controller 
} 

public class EmailViewModel 
{ 
    public string Email { get; set; } 
} 

Vista:

@using (Html.BeginForm()){ 
    @Html.AntiForgeryToken() 
    @Html.EditorFor(model => model.Emails) 
} 

EditorTemplates \ EmailViewModel.cshtml

@Html.TextBoxFor(model => model.Email) 

Loops NUNCA se requieren en MVC. Repito. NUNCA

+4

Los bucles NUNCA se requieren en MVC. Repito. NUNCA - No es así. – DavidB

+0

@DavidB - Apoyo mi declaración. Nombre un ejemplo donde se requiera y le mostraré cómo se puede evitar. – RPM1984

+0

Gracias por la respuesta, ¿esto incluye ayudantes que no tienen un bucle for? Trataré de presentar un desafío ya que pensé que era una afirmación bastante polémica sin razón. Me gusta que se demuestre que estoy equivocado, así que intentaré publicar un ejemplo cuando tenga tiempo – DavidB

1

Ésta es la forma aceptada para hacerlo

foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => !pm.HideSurroundingHtml && pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm))) { 

<div class="form-group"> 

    <label> 
     @prop.GetDisplayName() 
     @if (prop.IsRequired) 
     { 
      <span class="required">*</span> 
     } 
    </label> 
    @Html.Editor(prop.PropertyName) 

    @Html.ValidationMessage(prop.PropertyName, new {@class = "help-block"}) 
</div> 

}

Cuestiones relacionadas