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