¿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?


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});
}

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;
}

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.


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});

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>

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.