2012-07-09 19 views
12

Estoy usando C# junto con un ViewModel que pasa el modelo de vista desde el controlador a la vista.{obtener; conjunto; } utilizado en ViewModel

En mi modelo de vista, la siguiente parece que funciona como se esperaba, ya que pasa la información de descripción de la vista de nuevo al controlador:

public string Description { get; set; } 

Pero si tengo la siguiente, no va a pasar de nuevo la descripción. Descripción muestra nula

public string Description 

¿Por qué es el {get; conjunto; }

tan importante?

Respuesta

17

No sé mucho acerca de asp.net MVC/Razor, pero hay una diferencia importante entre los 2 ejemplos de código.

public string Description { get; set; } 

Crea una propiedad, una vez compilado, no es un campo privado generado en la clase, con métodos get/set que tienen acceso al campo. Una propiedad declarada con {get; set;} es el equivalente de:

private string _description; 
    public string Description 
    { 
     get 
     { 
      return _description; 
     } 
     set 
     { 
      this._description = value; 
     } 
    } 

Sin embargo la siguiente:

public string Description; 

crea un campo público sencilla.

Supongo que razor utiliza la reflexión para obtener valores del ViewModel, y probablemente busca una propiedad, no un campo. Por lo tanto, determina que la propiedad no existe, por lo tanto, devuelve nulo

+0

Esto puede sonar tonto, pero es que hay una manera de personalizar ese "valor" que se pasa al colocador? Esperaba ver el conjunto (valor de cadena) – Worthy7

+0

@ Worthy7 No entiendo lo que quiere decir con "personalizar". valor es una palabra clave contextual del lenguaje al declarar una propiedad, su tipo está determinado por el tipo de la propiedad. Es una palabra clave que se comporta exactamente como un parámetro de método.Por ejemplo, podría volver a asignarlo si lo desea. –

+0

@ Worthy7 https://msdn.microsoft.com/en-CA/library/a1khb4f8.aspx –

8

La sintaxis siguiente es una característica del lenguaje C# 'propiedades automáticas'.

public string Description { get; set; } 

ASP.NET MVC utiliza reflection y data-binding que funcionan únicamente con propiedades y no variables. El uso de propiedades para el acceso público es el camino a seguir.

Sugiera la lectura del artículo this donde el autor se retractó de su "desagrado" por las propiedades públicas.

1

El default model binder es el que vincula los valores de solicitud a las propiedades en los modelos. Vincula los valores solo a propiedades de configuración pública y ni siquiera a campos públicos.

Si desea vincular los valores a los campos, debe escribir su propio modelo de carpeta pero las propiedades públicas o mejor que los campos públicos para que no lo necesite.

0

Es una llamada propiedad de automóviles, y es esencialmente una forma abreviada de la siguiente (código similar será generado por el compilador):

private string name; 
public string Name 
{ 
    get 
    { 
     return this.name; 
    } 
    set 
    { 
     this.name = value; 
    } 
} 
Cuestiones relacionadas