2011-07-21 13 views
23

Creé un modelo de primer código EF4.1 (puede o no ser importante) y estoy tratando de obtener valores predeterminados para mi plantilla Crear andamio. Mi modelo se parece a:Anotación de propiedades en un modelo con valores predeterminados

class Person { 
    [DefaultValue (18)] 
    public int Age { get; set; } 
} 

y luego mi Crear vista parece:

<div class="editor-label"> 
    @Html.LabelFor(model => model.Age) 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(model => model.Age) 
    @Html.ValidationMessageFor(model => model.Age) 
</div> 

que esperaría en tiempo de ejecución, que el EditorFor sería rellenar previamente el cuadro de texto con "18", pero lo hace no tal cosa. ¿Estoy entendiendo mal para qué es el atributo DefaultValue, o hay algo más que debería hacer?

Nota: No quiero utilizar la anulación new { Value = "18" } en el método EditorFor, parece romper DRY.

Respuesta

31

No sé si esto satisfará tus necesidades DRY, pero creo que es un comienzo.

Me reelaborar el modelo un poco como esto:

public class Person { 
    private const int DEFAULT_AGE = 18; 
    private int _age = DEFAULT_AGE; 
    [DefaultValue(DEFAULT_AGE)] 
    public int Age { 
     get { return _age; } 
     set { _age = value; } 
    } 
} 

Mantener la vista como es, pero en la acción create hacer esto:

public ActionResult Create() { 
    return View(new Person()); 
} 

De esta manera, el cuadro de texto de entrada se creado con el valor de edad predeterminado, y solo habrá un lugar donde se especificará ese valor predeterminado.

+0

debo añadir que yo ya probé establecer la propiedad Edad en el constructor, lo que no parece funcionar bien. Sin embargo, la Vista está fuertemente tipada a Person. Sin embargo, lo que me faltaba era pasar una nueva Persona a la vista. Eso hizo lo que yo quería, y su solución es lo suficientemente SECA :) (Estoy omitiendo DefaultValue por completo, y simplemente usando los constructores) –

+0

¿Cómo se accede al atributo DefaultValue? No puedo encontrarlo – Johannes

+0

@Johannes quizás le falta el 'using System.ComponentModel' - http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx –

7
class Person { 
    public Person() { 
     Age = 18;  
    } 
    public int Age { get; set; } 
} 

En este escenario, cada vez que haces una nueva era persona se inicializará con los 18 años como la edad, incluso cuando el nuevo objeto es creado por la Cuaderno Modelo.

1

Modelo

class Person { 
    public Person() { 
     Age = 18;  
    } 
    public int Age { get; set; } 
} 

controlador

public ActionResult Create() { 
    return View(new Person()); 
} 

funciona bien.

1

Suponiendo que su punto de vista tiene una definición como: -

@model Person 

y sus controladores HTML GET devuelve un vacío Ver

return View(); 

Entonces sólo tiene que añadir una clase que puede ser renderizado que contiene por defecto valores

return View(new Person{ Age = 18 }); 

Otra opción es agregar un ayudante estático singleton a su Persona c lass que devuelve un valor predeterminado, la clase poblada

static public Person GetDefaultNew() 
     { 
      return new Person{ Age = 18 }; 
     } 

Luego hay que

return View(new Person.GetDefaultNew()); 
+0

No necesitarías actualizar el retorno de GetDefaultNew(), pero veo a dónde vas. En la pregunta original, simplemente había olvidado pasar cualquier instancia del modelo. –

+0

Para ampliar mi respuesta, diría que vale la pena crear su propia clase "ViewModel" que tenga todos los datos de instancia necesarios para la vista. Esto mantiene el controlador delgado, su modelo con sus anotaciones y su clase de modelo de vista con las reglas comerciales y otras opciones (como establecer valores comerciales predeterminados, algunos de los cuales no se conocerán sin hacer referencia a otras listas que también tendrá en el ver modelo) para la vista en cuestión. También hace que su modelo de vista sea altamente comprobable y la vista lo más simple posible – pixelda

0

Configuración JSON.parámetro de red DefaultValueHandling hace que el trabajo ValorPredeterminado:

class Person { 
    [JsonProperty("Age", DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] 
    [DefaultValue(18)] 
    public int Age { get; set; } 
} 
Cuestiones relacionadas