2012-10-25 22 views
6

Sto lavorando con MVC in .net 4.0. Ho un Html.ActionLink di base e desidero passare più parametri al controller/azione.Come passare più parametri (alcuni oggetti complessi) con Html.ActionLink

Ogni volta che eseguo il debug di ActionResult, viene eseguito solo uno dei miei parametri e l'altro è nullo (a seconda di quale è il primo). Ora so che posso passare oggetti complessi perché riesco a far passare l'oggetto "League". Tuttavia, non sono sicuro del motivo per cui solo uno dei miei parametri lo supera in qualsiasi momento.

Codice in Vista: (non molestare me su ViewBag io so che non è popolare anche, League è un oggetto complesso..)

@Html.ActionLink("Sort By WeeK", "Sort", "Schedule", 
       new { league = ViewBag.League, sortType = "Week" }, null) 

Codice in Controller: (nessuna sorpresa qui)

public ActionResult Sort(League league, string sortType) 
{ 
    //Do some stuff here 
    return View("Schedule"); 
} 

Immagino che la risposta ruoterà attorno al routing. Il che mi porta alla mia seconda domanda. Come posso ottenere questo tipo di ActionLink (Azione/Controller/Collezione di oggetti complessi e semplici) per lavorare senza aggiungere costantemente nuovi maproutes. È possibile aggiungere una RouteMap generica/con caratteri jolly in modo da non dover aggiungere costantemente mappe di percorso identiche a global.asax. O forse voglio un po 'di flessibilità nel tipo di oggetti che desidero passare in un'azione, quindi non posso predefinire la firma esatta.

Ho visto più post su questo argomento ma nessuno di loro ha risposto alle mie domande.

+0

strano. Prova FormCollection nell'azione del tuo controller e controlla se restituisce più chiavi. Il caso peggiore senario è possibile trasformarlo in un modulo e inviare l'HTML nascosto. – Ammar

+0

Quando dici "Quale è il primo", intendi prima nella firma del metodo o prima nell'URL del link? Come appare l'URL generato? –

risposta

4

Penso che potrebbe essere confuso a causa del parametro null. Prova questo:

@Html.ActionLink("Sort By WeeK", actionName:"Sort", controllerName: "Schedule", routeValues: new { league = ViewBag.League, sortType = "Week" }, htmlAttributes:null) 
+0

Grazie per il feedback. Lo metterò alla prova e tornerò da te. Con l'espansione della portata dell'app, l'oggetto League divenne una proprietà pubblica del controller, quindi non avevo più bisogno di passarlo. Proverò il tuo suggerimento la prossima volta che dovrò passare più di un parametro e pubblicare i risultati Qui. Buon venerdì. – ArdAtak

+0

Ci scusiamo per la risposta in ritardo, ma ho appena visto questo e ho capito che dovevo ancora una conferma. Il suggerimento ha funzionato. Grazie. – ArdAtak

0

Im provando molti modi, ma nessuno mi non aiuterà, alla fine `m sé risolto il problema, solo "spacchettare" il vostro oggetto su variabili da un oggetto, in questo modo:

@{ var sendObject = (MyObject) ViewData["SendObject"]; } 
... 
@Html.ActionLink("Description", "MyActionName", "MyController", new { sendObject.var1, sendObject.var2, sendObjec.var3, sortType = "Week" }, new { @style = "color: white" }) 

controller:

public ActionResult MyActionName(MyObject sendObject, string sortType) 
{ 
... 
} 

quadro si wil vincolare il proprio oggetto SendObject

0

solo fare questo:

VIEW: 
@Html.ActionLink("Link text", "Action name", "Controller name", 
         new { paramName1 = @modelDataItem.value, paramName2 = @modelDataItem.value}, null) 

CONTROLLER: 
public ActionResult ActionName(string paramName1 , string paramName2) 

Nb: assicurarsi che i nomi dei parametri sulle azioni di controllo è uguale a quello utilizzato nel link azione. Se i valori non vengono consegnati ai parametri di azione, controllare se i modelli della vista contengono il valore che si sta cercando. Forse non è mai stato inviato alla vista.

Problemi correlati