ASP.Net MVC Cómo pasar datos de la vista al controlador [cerrado]

81

Soy completamente nuevo en ASP.Net y estoy seguro de que esta es una pregunta muy básica.Tengo una Vista en la que hay un enlace para generar un informe, pero para poder generar un informe, debo pedirle al usuario que proporcione un nombre de texto adecuado como bien.

Hasta ahora, he podido pasar datos desde el servidor a la vista usando los modelos pasados ​​de mi controlador a la vista, pero no estoy seguro de cómo pasar los datos de la vista a mi controlador.

Solo necesito pasar una cadena de la vista al controlador en este caso.

Se agradecerá cualquier consejo con ejemplo.

ACTUALIZAR

Entiendo que tengo que publicar los datos en el servidor, pero ¿cómo se realiza en forma de código y controlador razorhtml?

Ahmed
fuente
el usuario tiene que publicar algo; la vista no sabe directamente cómo comunicarse con un controlador.
Daniel A. White
Si lee la documentación de Microsoft, verá que NO explica cómo hacer esto.
Paul McCarthy

Respuestas:

133

Puede hacerlo con ViewModels, como la forma en que pasó datos de su controlador para ver.

Suponga que tiene un modelo de vista como este

public class ReportViewModel
{
   public string Name { set;get;}
}

y en tu acción GET,

public ActionResult Report()
{
  return View(new ReportViewModel());
}

y su vista debe estar fuertemente escrita para ReportViewModel

@model ReportViewModel
@using(Html.BeginForm())
{
  Report NAme : @Html.TextBoxFor(s=>s.Name)
  <input type="submit" value="Generate report" />
}

y en su método de acción HttpPost en su controlador

[HttpPost]
public ActionResult Report(ReportViewModel model)
{
  //check for model.Name property value now
  //to do : Return something
}

O simplemente, puede hacer esto sin las clases POCO (Viewmodels)

@using(Html.BeginForm())
{
   <input type="text" name="reportName" />
   <input type="submit" />
}

y en su acción HttpPost, use un parámetro con el mismo nombre que el nombre del cuadro de texto.

[HttpPost]
public ActionResult Report(string reportName)
{
  //check for reportName parameter value now
  //to do : Return something
}

EDITAR: Según el comentario

Si desea publicar en otro controlador, puede usar esta sobrecarga del método BeginForm.

@using(Html.BeginForm("Report","SomeOtherControllerName"))
{
   <input type="text" name="reportName" />
   <input type="submit" />
}

¿Pasando datos del método de acción a la vista?

Puede usar el mismo modelo de vista, simplemente establezca los valores de propiedad en su método de acción GET

public ActionResult Report()
{
  var vm = new ReportViewModel();
  vm.Name="SuperManReport";
  return View(vm);
}

y en tu vista

@model ReportViewModel
<h2>@Model.Name</h2>
<p>Can have input field with value set in action method</p>
@using(Html.BeginForm())
{
  @Html.TextBoxFor(s=>s.Name)
  <input type="submit" />
}
Shyju
fuente
En la opción / método 2 que presentó (sin modelo), ¿hay alguna forma de especificar el nombre del controlador? porque el controlador que debería recibir esta solicitud de publicación es diferente al controlador de esta vista ..
Ahmed
@Ahmed: Comprueba la respuesta actualizada. Puede utilizar la sobrecarga específica del método BeginForm.
Shyju
4
excelente, gracias por su gran respuesta ..
Ahmed
Bien, he estado buscando por algunas horas. ¡Gracias!
Dan Beaulieu
¡¡Gracias!! Respuesta muy clara. Para mi caso, en la acción HttpPost, no necesitaba usar un parámetro con el mismo nombre que el nombre del cuadro de texto. Solo coloque el objeto modelo como parámetro, puedo recuperar los valores.
Hnin Htet Htet Aung
27

En caso de que no quiera / necesite publicar:

@Html.ActionLink("link caption", "actionName", new { Model.Page })  // view's controller
@Html.ActionLink("link caption", "actionName", "controllerName", new { reportID = 1 }, null);

[HttpGet]
public ActionResult actionName(int reportID)
{

Tenga en cuenta que el ID de informe en la nueva {} parte coincide con el ID de informe en los parámetros de acción, puede agregar cualquier número de parámetros de esta manera, pero más de 2 o 3 (algunos argumentarán siempre) debería pasar un modelo a través de un POST ( según otra respuesta)

Editar : Se agregó nulo para una sobrecarga correcta como se señaló en los comentarios. Hay una serie de sobrecargas y si especifica tanto acción + controlador, entonces necesita routeValues ​​y htmlAttributes. Sin el controlador (solo título + acción), solo se necesitan routeValues, pero puede ser una buena práctica especificar siempre ambos.

libertad n-m
fuente
4
Para su información, a cualquiera que se encuentre con esta respuesta simple, agregue un valor nulo después de incluir los valores de su ruta [new {reportID = 1}]; de lo contrario, intentará tomarlos como htmlAttributes y no llegarán,
Hardycore
22
<form action="myController/myAction" method="POST">
 <input type="text" name="valueINeed" />
 <input type="submit" value="View Report" />
</form> 

controlador:

[HttpPost]
public ActionResult myAction(string valueINeed)
{
   //....
}
Pyme azul
fuente
1
<input type = "valueINeed" type = "text"> debe ser <input name = "valueINeed" type = "text">
GregH
Thnx. Respuesta actualizada.
Azure SME