43

I have something like this:

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)
}

and in my .cshtml:

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

This works fine with the following Post Action:

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

  return RedirectToAction(...);

}

However, I want to pass an additional parameter from the @ViewBag.Club object:

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

How do I code this in the BeginForm?

nemesv
  • 138,284
  • 16
  • 416
  • 359
Andy Johnston
  • 465
  • 1
  • 6
  • 8

2 Answers2

96

There are two options here.

  1. a hidden field within the form, or
  2. Add it to the route values parameter in the begin form method.

Edit

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

or

 @using(Html.BeginForm("action", "controller",
                       new { clubid = @Viewbag.Club.id }, FormMethod.Post, null)
Johan
  • 8,068
  • 1
  • 33
  • 46
1

Another option I like, which can be generalized once I start seeing the code not conform to DRY, is to use one controller that redirects to another controller.

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

  return RedirectToAction(action, "Accounts");
}

I find this allows me to apply my logic in one location and re-use it without have to sprinkle JavaScript in the views to handle this. And, as I mentioned I can then refactor for re-use as I see this getting abused.

JQII
  • 175
  • 2
  • 14