2012-08-29 37 views
6

Soy bastante nuevo para MVC 3.MVC envío de datos a la vista de Controlador

Yo sé cómo enviar un objeto fuertemente tipado de un controlador a una vista. Lo que tengo ahora, es una Vista que contiene una tabla/formulario que consta de esos datos.

El usuario puede cambiar esos datos mientras están en esa Vista (página html).

Cuando hacen clic en "Guardar", ¿cómo puedo enviar los datos de la Vista al Controlador para que pueda actualizar mi base de datos.

¿Sobrecarga el método del Controlador para que acepte un parámetro del tipo de modelo? ¿Puedes proporcionar algún código fuente?

(No mostrar el código de datos persistentes en una base de datos, sé cómo hacer esa parte).

Muchas gracias por ayudarme.

Yo también preferiría usar @Html.BeginForm()

Respuesta

9

Me gusta crear un método de acción para mis datos de publicación. Así que digamos que usted tiene un UserViewModel:

public class UserViewModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

A continuación, un UserController:

public class UserController 
{ 
    [HttpGet] 
    public ActionResult Edit(int id) 
    { 
     // Create your UserViewModel with the passed in Id. Get stuff from the db, etc... 
     var userViewModel = new UserViewModel(); 
     // ... 

     return View(userViewModel); 
    } 

    [HttpPost] 
    public ActionResult Edit(UserViewModel userViewModel) 
    { 
     // This is the post method. MVC will bind the data from your 
     // view's form and put that data in the UserViewModel that is sent 
     // to this method. 

     // Validate the data and save to the database. 

     // Redirect to where the user needs to be. 
    } 
} 

Estoy suponiendo que tiene una forma en su opinión ya. Deberá asegurarse de que el formulario publique los datos en el método de acción correcto. En mi ejemplo, usted crearía el formulario de la siguiente manera:

@model UserViewModel 

@using (Html.BeginForm("Edit", "User", FormMethod.Post)) 
{ 
    @Html.TextBoxFor(m => m.Name) 
    @Html.HiddenFor(m => m.Id) 
} 

La clave de todo esto es la vinculación del modelo que hace MVC. Utilice los ayudantes de HTML, como Html.TextBoxFor I used. Además, notarás la línea superior del código de vista que agregué. El @model le dice a la vista que le enviará un UserViewModel. Deje que el motor trabaje para usted.

Editar: Buena llamada, hizo todo en el Bloc de notas, se olvidó de un HiddenFor para el ID!

+2

+1 estaba escribiendo prácticamente la misma respuesta. También para la parte de vista, puede usar [EditorForModel()] (http://msdn.microsoft.com/en-us/library/ee430917 (v = vs.98) .aspx) junto con DataAnnotaciones para controlar el salida en lugar de configurar manualmente cada propiedad editable. – James

+1

Great catch @nonnb! Editado mi ejemplo. – Gromer

+0

@James, nunca he hecho mucho con EditorForModel, y no estoy seguro de lo complicado que es su sitio. Buena sugerencia, sin embargo. – Gromer

1

En MVC, el acto de raspado de datos de POST o GET HttpRequests se conoce como enlace de modelos - hay un montón de SO questions relacionada con este.

Fuera de la caja, MVC vinculará sus variables de Obtener y Publicar según las convenciones, p. Ej. un campo de formulario con el nombre 'FormName' se vinculará nuevamente a un parámetro en su controlador con el mismo nombre.

El encuadernado de modelos también funciona para objetos: MVC instanciará un objeto para su controlador y establecerá las propiedades con el mismo nombre que su formulario.

+0

¿Podría indicarme algún código fuente para poder estudiarlo? – Subby

Cuestiones relacionadas