2013-06-09 16 views
26

ho qualcosa di simile:passare più parametri a 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) 
} 

e nel mio .cshtml:

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

Questo funziona bene con la seguente azione del messaggio:

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

    return RedirectToAction(...); 

} 

Tuttavia, voglio passare un parametro aggiuntivo dall'oggetto @ViewBag.Club:

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

Come si codifica questo nello BeginForm?

risposta

60

Ci sono due opzioni qui.

  1. un campo nascosto all'interno della forma, o
  2. aggiungerlo alla rotta valori dei parametri nel metodo inizio modulo.

Modifica

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

o

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

Grazie @Johan - ha funzionato a meraviglia. (Metodo 2). –

+0

@Johan c'è qualche grande differenza tra il 2? – Vahx

+0

@Io intendevo più lungo la linea di sicurezza, prestazioni o altro? è uno alla vecchia maniera o in un modo nuovo? – Vahx

0

Un'altra opzione che mi piace, che può essere generalizzato una volta che comincio a vedere il codice non conforme ad asciugare, è quello di utilizzare un controller che reindirizza a un altro controller.

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

    return RedirectToAction(action, "Accounts"); 
} 

Trovo questo mi permette di applicare la mia logica in un unico luogo e ri-utilizzarlo senza dover spruzzare JavaScript nelle viste per gestire questa situazione. E, come ho detto, posso quindi fare il refactoring per il riutilizzo, perché vedo che questo viene abusato.

Problemi correlati