web-dev-qa-db-fra.com

ASP.Net MVC Comment transmettre des données de la vue au contrôleur

Je suis complètement nouveau sur ASP.Net et je suis sûr que c’est une question très élémentaire. J’ai une vue dans laquelle il existe un lien pour générer un rapport, mais pour pouvoir générer un rapport, je dois demander à l’utilisateur de fournir un nom de texte approprié. bien.

Jusqu'à présent, j'ai été en mesure de transmettre des données d'un serveur à un autre à l'aide de modèles transmis de mon contrôleur à un autre, mais je ne suis pas sûr de savoir comment passer des données d'une vue à mon contrôleur.

J'ai juste besoin de passer une chaîne de vue à contrôleur dans ce cas.

Tout conseil avec exemple sera apprécié.

UPDATE

Je comprends que je dois renvoyer les données au serveur, mais comment cela se concrétise-t-il sous forme de code et de contrôleur razorhtml?

68
Ahmed

Vous pouvez le faire avec ViewModels, comme pour la manière dont vous avez transmis les données de votre contrôleur.

Supposons que vous avez un modèle de vue comme celui-ci

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

et dans votre action GET,

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

et votre vue doit être fortement typée sur ReportViewModel

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

et dans votre méthode d'action HttpPost dans votre contrôleur

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

OU Simplement, vous pouvez le faire sans les classes POCO (Viewmodels)

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

et dans votre action HttpPost, utilisez un paramètre portant le même nom que le nom de la zone de texte.

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

EDIT: Selon le commentaire

Si vous souhaitez publier sur un autre contrôleur, vous pouvez utiliser cette surcharge de la méthode BeginForm.

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

Passer des données de la méthode d'action à afficher?

Vous pouvez utiliser le même modèle de vue, définissez simplement les valeurs de propriété dans votre méthode d'action GET.

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

et à votre avis

@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" />
}
117
Shyju

Si vous ne voulez pas/n'avez pas besoin de poster:

@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)
{

Notez que reportID dans la nouvelle partie {} correspond à reportID dans les paramètres d'action. Vous pouvez ajouter autant de paramètres que vous le souhaitez, mais pas plus de 2 ou 3 (certains diront toujours), vous devriez passer un modèle via un POST (selon autre réponse)

Edit: null ajouté pour une surcharge correcte comme indiqué dans les commentaires. Il y a un certain nombre de surcharges et si vous spécifiez à la fois action + controller, vous aurez besoin de routeValues ​​et de htmlAttributes. Sans le contrôleur (juste la légende + l'action), seules les valeurs routeValues ​​sont nécessaires, mais il peut être recommandé de toujours spécifier les deux.

24
freedomn-m
<form action="myController/myAction" method="POST">
 <input type="text" name="valueINeed" />
 <input type="submit" value="View Report" />
</form> 

manette:

[HttpPost]
public ActionResult myAction(string valueINeed)
{
   //....
}
17