2011-02-10 37 views
23

Pensé que esto iba a ser sencillo pero logré manguera de alguna manera. Si quiero pasar parámetros de URL a otra acción, ¿tengo que crear una nueva ruta para eso?ASP.Net MVC Cómo pasar parámetros de url usando Html.RenderAction a una ChildAction

controlador

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

vista

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

error

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

Respuesta

30

El problema aquí es que

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

es el equivalente a

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

En los los Webforms ViewEngine (que también es la misma un Response.Write). Dado que RenderAction devuelve void, no puede Response.Write. Lo que se quiere hacer es lo siguiente:

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

La sintaxis @{ } significa un bloque de código en el motor de vista de la maquinilla de afeitar, lo que sería equivalente a la siguiente los los formularios web ViewEngine:

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

O puede llamar a @ Html.Action (...) en su lugar, para llamarlo como un método que devuelve su contenido (si no le gusta usar las llaves, etc.) –

+0

Gracias, yo solo lo descubrí leyendo otra publicación similar. ¡Gracias! Creo que esto también me dio una vez antes ... – JBeckton

+0

¡Buena explicación! –

11

La respuesta corta sería: use @ Html.Action().

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

El long answer ya le fue otorgado por Nathan Anderson.

P.S. El mérito de esta respuesta realmente se lo debo a James Nail, quien lo publicó como un comentario en la respuesta de Nathan, pero me pareció tan fácil y valioso que pensé que debería ser una respuesta individual.

Cuestiones relacionadas