¿Cómo pasar parámetros a una vista parcial en ASP.NET MVC?

93

Supongamos que tengo esta vista parcial:

Your name is <strong>@firstName @lastName</strong>

que es accesible a través de una acción solo para niños como:

[ChildActionOnly]
public ActionResult FullName(string firstName, string lastName)
{

}

Y quiero usar esta vista parcial dentro de otra vista con:

@Html.RenderPartial("FullName")

En otras palabras, quiero poder pasar firstName y lastName de vista a vista parcial. ¿Cómo debo hacer eso?

Saeed Neamati
fuente
Pregunta muy relacionada: stackoverflow.com/questions/1909134/…
Chris Moschini

Respuestas:

77

Utilice esta sobrecarga ( RenderPartialExtensions.RenderPartialen MSDN ):

public static void RenderPartial(
    this HtmlHelper htmlHelper,
    string partialViewName,
    Object model
)

entonces:

@{Html.RenderPartial(
    "FullName",
    new { firstName = model.FirstName, lastName = model.LastName});
}
David Wick
fuente
1
Bueno, lo intenté, pero obtengo La mejor coincidencia de método sobrecargado para 'System.Web.WebPages.WebPageExecutingBase.Write (System.Web.WebPages.HelperResult)' tiene un error de argumentos no válidos . ¿Cómo debo implementar el método del controlador? ¿Debería tener parámetros de entrada?
Saeed Neamati
18
Entonces pasó un parámetro como este, ¿cómo se accede a él en vista parcial?
Burjua
9
Tampoco necesita los soportes. @Html.Partial()es igual que @{Html.RenderPartial();}pero mucho más bonito. También tienen las mismas sobrecargas.
smdrager
7
¿Cómo accedes al objeto? Model.firstNamey sus similares arrojan una excepción queobject doesn't have a 'firstName' property
cenizas999
4
@ ashes999 puede acceder a través de ViewData ... pero ayude a mantener las cosas ordenadas simplemente creando un modelo específico para su uso. Úselo una vez y algunos pueden considerarlo un lanzamiento, pero úselo más veces que eso y es una obviedad.
Ted
84

Aquí hay otra forma de hacerlo si desea utilizar ViewData:

@Html.Partial("~/PathToYourView.cshtml", null, new ViewDataDictionary { { "VariableName", "some value" } })

Y para recuperar los valores pasados:

@{
    string valuePassedIn = this.ViewData.ContainsKey("VariableName") ? this.ViewData["VariableName"].ToString() : string.Empty;
}
Garry Inglés
fuente
Gracias, su respuesta funcionó sin crear un modelo para esto.
alvarodms
De todos los ejemplos, este es el único que funcionó completamente para mí. gracias
BrianLegg
Esto es lo que estaba buscando, sin modelo. gracias :)
Anupam Roy
Excelente respuesta, pero con MVC 4 use Html.RenderPartial en lugar de Html.Partial
Graham Laight
24

Necesita crear un modelo de vista. Algo como esto debería hacer ...

public class FullNameViewModel
{
     public string FirstName { get; set; }
     public string LastName { get; set; }

     public FullNameViewModel() { } 

     public FullNameViewModel(string firstName, string lastName)
     {
          this.FirstName = firstName;
          this.LastName = lastName;
     }

}

luego, desde el resultado de su acción, pase el modelo

return View("FullName", new FullNameViewModel("John", "Doe"));

y podrá acceder @Model.FirstNamey en @Model.LastNameconsecuencia.

Simonlchilds
fuente
13

asegúrese de agregar {} alrededor de Html.RenderPartial, como:

@{Html.RenderPartial("FullName", new { firstName = model.FirstName, lastName = model.LastName});}

no

@Html.RenderPartial("FullName", new { firstName = model.FirstName, lastName = model.LastName});
BlackTigerX
fuente
1
¿Cómo se ve la definición de su Vista parcial? ¿Qué es la declaración @model? Es anónimo ...
Elisabeth
sí, asegúrese de agregar { }, perdí el tiempo hasta que encontré este artículo
shaijut
4

Lo siguiente me funciona en dotnet 1.0.1 :

./ourView.cshtml

@Html.Partial(
  "_ourPartial.cshtml",
  new ViewDataDictionary(this.Vi‌​ewData) {
    {
      "hi", "hello" 
    } 
  }
);

./_ourPartial.cshtml

<h1>@this.ViewData["hi"]</h1>
lagos son
fuente
0

Sólo:

@Html.Partial("PartialName", Model);
Cássio Batista Pereira
fuente