2011-05-19 50 views
63

Pregunta de novato. Tengo un parámetro que se pasa a una vista de creación. Necesito establecer un nombre de campo con un valor predeterminado. @ Html.EditorFor (model => model.Id) Necesito establecer este campo de entrada con Id de nombre con un valor predeterminado que se está pasando a la vista mediante un actionlink.Html.EditorFor Establecer valor predeterminado

Entonces, ¿cómo puede establecerse este campo de entrada - @ Html.EditorFor (model => model.Id) - con un valor predeterminado.

¿Sería el siguiente trabajo? Donde el número 5 es un parámetro, paso al campo de texto para establecer el valor predeterminado.

@Html.EditorFor(c => c.PropertyName, new { text = "5"; })

Respuesta

55

La forma más limpia de hacerlo es pasar una nueva instancia de la entidad creada a través del controlador:

//GET 
public ActionResult CreateNewMyEntity(string default_value) 
{ 
    MyEntity newMyEntity = new MyEntity(); 
    newMyEntity._propertyValue = default_value; 

    return View(newMyEntity); 
} 

Si desea pasar el valor por defecto a través ActionLink

@Html.ActionLink("Create New", "CreateNewMyEntity", new { default_value = "5" }) 
+0

Esta es la solución que terminé usando. Anton Semenov está en lo cierto: la ideología de MVC requiere que el desarrollador establezca valores predeterminados en el Controlador y no en la Vista. – Jake

85

Esto es lo que he encontrado:

@Html.TextBoxFor(c => c.Propertyname, new { @Value = "5" }) 

obras con un capital V, no es un caso v inferior (bajo el supuesto de valor es una palabra clave utilizada en los emisores típicamente) Lower vs upper value

@Html.EditorFor(c => c.Propertyname, new { @Value = "5" }) 

no funciona

Su código termina así aunque

<input Value="5" id="Propertyname" name="Propertyname" type="text" value="" /> 

Valor frente al valor. No estoy seguro de que me guste eso.

¿Por qué no simplemente comprueba la acción del controlador si la propiedad tiene un valor o no y si no lo establece en tu modelo de vista a tu valor predeterminado y lo dejas para evitar todo este trabajo del mono en la vista?

+0

** NUNCA ** establece el atributo de valor cuando se utilizan los métodos 'HtmlHelper'. Establece el valor de la propiedad en el método GET antes de pasar el modelo a la vista. –

13

mejor opción es hacer esto en su modelo de vista como

public class MyVM 
{ 
    int _propertyValue = 5;//set Default Value here 
    public int PropertyName{ 
     get 
     { 
      return _propertyValue; 
     } 
     set 
     { 
      _propertyValue = value; 
     } 
    } 
} 

A continuación, en su opinión

@Html.EditorFor(c => c.PropertyName) 

va a funcionar de la manera que quieres es que (si no hay valor predeterminado valor será allí)

14

No es correcto establecer el valor predeterminado en Ver. La Vista debe realizar un trabajo de visualización, no más. Esta acción rompe la ideología del patrón MVC. Entonces, el lugar correcto para establecer los valores predeterminados: crear el método de la clase de controlador.

+0

Quiero cambiar el formato de un valor de fecha y hora (dd/MM/aaaa mm: HH: ss) a (aaaa/MM/dd) –

3

acabo hizo esto (la primera respuesta de Shadi) y funciona un regalo:

public ActionResult Create() 
    { 
     Article article = new Article(); 
     article.Active = true; 
     article.DatePublished = DateTime.Now; 
     ViewData.Model = article; 
     return View(); 
    } 

Podría poner los valores predeterminados i n mi modelo como un adicto a MVC propper: (estoy usando Entity Framework)

public partial class Article 
    { 
     public Article() 
     { 
      Active = true; 
      DatePublished = Datetime.Now; 
     } 
    } 

    public ActionResult Create() 
    { 
     Article article = new Article(); 
     ViewData.Model = article; 
     return View(); 
    } 

Puede alguien ver ningún inconvenientes de este?

+1

Estos son valores predeterminados fijos, si desea proporcionarlos durante el tiempo de ejecución, necesita un enfoque diferente. – Shadi

+0

Gracias @Shadi, técnicamente Datetime.Now no es un valor fijo. Si el valor predeterminado * se * generó en el tiempo de ejecución, ¿sería la responsabilidad del modelo o el controlador? – Smithy

+1

Simplemente refiérase a las reglas de MVC (¡puede romperlo!) El modelo es solo para almacenar los datos, Ver para verlos, y su negocio debe colocarse en el Controlador o las clases a las que accede el controlador. Respuesta corta, es la responsabilidad del controlador. – Shadi

1

¿No debería el @Html.EditorFor() hacer uso de los atributos que pone en su modelo?

[DefaultValue(false)] 
public bool TestAccount { get; set; } 
0

En el método constructor de su clase de modelo, establezca el valor predeterminado que desee. Luego, en su primera acción, cree una instancia del modelo y páselo a su vista.

public ActionResult VolunteersAdd() 
    { 
     VolunteerModel model = new VolunteerModel(); //to set the default values 
     return View(model); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult VolunteersAdd(VolunteerModel model) 
    { 


     return View(model); 
    } 
Cuestiones relacionadas