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
?
Il y a deux options ici.
Modifier
@Html.Hidden("clubid", ViewBag.Club.id)
ou
@using(Html.BeginForm("action", "controller",
new { clubid = @Viewbag.Club.id }, FormMethod.Post, null)
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.