2013-06-09 19 views
26

mam coś takiego:przekazać wiele parametrów w Html.BeginForm MVC

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

iw moim .cshtml:

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

to działa prawidłowo z następującym działaniu post:

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

    return RedirectToAction(...); 

} 

Jednakże, chcę przekazać dodatkowy parametr z obiektu :

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

Jak mogę to zakodować w BeginForm?

Odpowiedz

60

Dostępne są dwie opcje.

  1. ukryty pola w formularzu, lub
  2. Dodaj go do wartości trasa parametr w metodzie rozpocząć formularza.

Edit

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

lub

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

Dzięki @Johan - przepyszne. (Metoda 2). –

+0

@Johan Czy jest jakaś duża różnica między 2? – Vahx

+0

@ Mam na myśli więcej na linii bezpieczeństwa, wydajności czy czegokolwiek? jest starym sposobem czy nowym sposobem? – Vahx

0

Inną opcją Lubię, które można uogólnić raz zacznę widząc kodu nie są zgodne z suchym, jest wykorzystanie jednego kontrolera, który przekierowuje do innego kontrolera.

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

    return RedirectToAction(action, "Accounts"); 
} 

Uważam to pozwala mi zastosować moją logikę w jednym miejscu i ponownie używać go bez musiał posypać JavaScript w widokach z tym poradzić. I, jak już wspomniałem, mogę następnie zrestrukturyzować ponowne użycie, ponieważ widzę, jak się to nadużywa.

Powiązane problemy