web-dev-qa-db-fra.com

Passer plusieurs paramètres dans Html.BeginForm MVC

J'ai quelque chose comme ça:

public ActionResult Create(int clubid)
{
  var club = db.Clubs.Single(c=>c.Id == clubid);
  ViewBag.Club = club;
  Competition comp = db.Competitions.Create();
  return View(comp)
}

et dans mon .cshtml:

@Model Models.Competition
...
@Using(Html.BeginForm())
{
  ...
  <input type="submit" value="Save" />
}

Cela fonctionne bien avec l'action suivante:

[HttpPost]
public ActionResult Create(Competition comp)
{
  if (ModelState.IsValid){...}

  return RedirectToAction(...);

}

Cependant, je souhaite passer un paramètre supplémentaire à partir de l'objet @ViewBag.Club:

[HttpPoSt]
public ActionResult Create(int clubid, Competition comp){...}

Comment est-ce que je code ceci dans la BeginForm?

27
Andy Johnston

Il y a deux options ici.

  1. un champ caché dans le formulaire, ou 
  2. Ajoutez-le au paramètre de valeurs d'itinéraire dans la méthode de formulaire begin.

Modifier

@Html.Hidden("clubid", ViewBag.Club.id)

ou

 @using(Html.BeginForm("action", "controller",
                       new { clubid = @Viewbag.Club.id }, FormMethod.Post, null)
72
Johan

Une autre option qui me plaît, qui peut être généralisée une fois que je commence à voir le code non conforme à DRY, consiste à utiliser un contrôleur qui redirige vers un autre contrôleur.

public ActionResult ClientIdSearch(int cid)
{
  var action = String.Format("Details/{0}", cid);

  return RedirectToAction(action, "Accounts");
}

Je trouve que cela me permet d'appliquer ma logique dans un emplacement et de la réutiliser sans avoir à saupoudrer du JavaScript dans les vues pour gérer cela. Et, comme je l’ai dit, je pourrai alors refacturer pour réutiliser, car je constate que les abus sont commis.

0
Jose Q