2011-02-10 18 views
23

Ho pensato che sarebbe stato semplice, ma sono riuscito a renderlo flessibile. Se voglio passare i parametri URL a un'altra azione devo creare una nuova rotta per quello?ASP.Net MVC Come passare i parametri url utilizzando Html.RenderAction a un'azione child

controllore

[ChildActionOnly] 
    public ActionResult ContentSection(string sectionAlias, string mvcController, string mvcAction = null) 

vista

@Html.RenderAction("ContentSection", "Portal", new {sectionAlias = "TermsAndConditions", mvcController = "Portal", mvcAction = "ChoosePayment"}) 

errore

CS1502: The best overloaded method match for 'System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)' has some invalid arguments 

risposta

30

Il problema è che

@Html.RenderAction("ContentSection", "Portal", new {sectionAlias = "TermsAndConditions", mvcController = "Portal", mvcAction = "ChoosePayment"}) 

è l'equivalente di

<%= Html.RenderAction("ContentSection", "Portal", new {sectionAlias = "TermsAndConditions", mvcController = "Portal", mvcAction = "ChoosePayment"}) %> 

Negli le Webforms ViewEngine (che è anche lo stesso un Response.Write). Dal RenderAction restituisce void, non è possibile Response.Write esso. Che cosa si vuole fare è questo:

@{ 
    Html.RenderAction("ContentSection", "Portal", new {sectionAlias = "TermsAndConditions", mvcController = "Portal", mvcAction = "ChoosePayment"}); 
} 

La sintassi @{ } significa un blocco di codice nel motore di visualizzazione Razor, che sarebbe equivalente al seguente i le Webforms ViewEngine:

<% Html.RenderAction("ContentSection", "Portal", new {sectionAlias = "TermsAndConditions", mvcController = "Portal", mvcAction = "ChoosePayment"}); %> 
+9

Oppure puoi chiamare @ Html.Action (...) invece, per chiamarlo come metodo che restituisce il tuo contenuto (se non ti piace usare le parentesi graffe, ecc.) –

+0

Grazie, ho solo capito fuori leggendo un altro post simile. Grazie! Penso che questo mi sia già capitato una volta .. – JBeckton

+0

Ottima spiegazione! –

11

La risposta breve sarebbe: use @ Html.Action().

@Html.Action("ContentSection", "Portal", new {sectionAlias = "Terms", ...}) 

Il long answer è stata data da Nathan Anderson.

P.S. Il merito di questa risposta va a James Nail, che lo ha pubblicato come commento nella risposta di Nathan, ma l'ho trovato così facile e prezioso che ho pensato che dovesse essere una risposta individuale.

Problemi correlati