2011-09-26 12 views

Respuesta

86

En primer lugar, las mayúsculas son importantes.

@model ("m" minúscula) es una palabra clave reservada en las vistas de la maquinilla de afeitar para declarar el tipo de modelo en la parte superior de la vista, por ejemplo:

@model MyNamespace.Models.MyModel

Más adelante en el archivo, se puede hacer referencia a la atributo que desea con @Model.Attribute (mayúscula "M").

@model declara el modelo. Model hace referencia a la ejemplificación del modelo.

En segundo lugar, puede asignar un valor a su modelo y usarlo más adelante en la página, pero no será persistente cuando la página envíe a la acción del controlador a menos que sea un valor en un campo de formulario. Con el fin de obtener el valor de vuelta en su modelo durante el proceso de enlace de modelos, es necesario asignar el valor a un campo de formulario, por ejemplo:

Opción 1

en su acción de controlador que necesita para crear una modelo para la primera vista de su página; de lo contrario, cuando intente establecer Model.Attribute, el objeto Model será nulo.

controlador:

// This accepts [HttpGet] by default, so it will be used to render the first call to the page 
public ActionResult SomeAction() 
{ 
    MyModel model = new MyModel(); 
    // optional: if you want to set the property here instead of in your view, you can 
    // model.Attribute = "whatever"; 
    return View(model); 
} 

[HttpPost] // This action accepts data posted to the server 
public ActionResult SomeAction(MyModel model) 
{ 
    // model.Attribute will now be "whatever" 
    return View(model); 
} 

Vista:

@{Model.Attribute = "whatever";} @* Only do this here if you did NOT do it in the controller *@ 
@Html.HiddenFor(m => m.Attribute); @* This will make it so that Attribute = "whatever" when the page submits to the controller *@ 

Opción 2

O, ya que los modelos están basados ​​en nombres, puede omitir la creación del modelo de su controlador y justo nombre un campo de formulario con el mismo nombre que la propiedad de su modelo. En este caso, establecer un campo oculto llamado "Atributo" en "lo que sea" garantizará que cuando se envíe la página, el valor "lo que sea" se vincule a la propiedad Attribute de su modelo durante el proceso de vinculación del modelo. Tenga en cuenta que no tiene que ser un campo oculto, simplemente cualquier campo de entrada HTML con name="Attribute".

controlador:

public ActionResult SomeAction() 
{ 
    return View(); 
} 

[HttpPost] // This action accepts data posted to the server 
public ActionResult SomeAction(MyModel model) 
{ 
    // model.Attribute will now be "whatever" 
    return View(model); 
} 

Vista:

@Html.Hidden("Attribute", "whatever");

+1

Gracias por esto. Gran respuesta. – levteck

+1

Esta respuesta debería ir al salón de la fama – petric

Cuestiones relacionadas