Como passar parâmetros para uma visão parcial no ASP.NET MVC?

93

Suponha que eu tenha esta visão parcial:

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

que pode ser acessado por meio de uma ação apenas infantil, como:

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

}

E eu quero usar essa visão parcial dentro de outra visão com:

@Html.RenderPartial("FullName")

Em outras palavras, eu quero ser capaz de passar firstName e lastName da visualização para a visualização parcial. Como devo fazer isso?

Saeed Neamati
fonte
Pergunta intimamente relacionada: stackoverflow.com/questions/1909134/…
Chris Moschini

Respostas:

77

Use esta sobrecarga ( RenderPartialExtensions.RenderPartialno MSDN ):

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

tão:

@{Html.RenderPartial(
    "FullName",
    new { firstName = model.FirstName, lastName = model.LastName});
}
David Wick
fonte
1
Bem, tentei isso, mas estou obtendo A melhor correspondência de método sobrecarregado para 'System.Web.WebPages.WebPageExecutingBase.Write (System.Web.WebPages.HelperResult)' tem alguns erros de argumentos inválidos . Como devo implementar o método do controlador? Deve ter parâmetros de entrada?
Saeed Neamati 01 de
18
Então você passou parâmetro como este, como você acessa em vista parcial?
Burjua
9
Você também não precisa dos colchetes. @Html.Partial()é o mesmo, @{Html.RenderPartial();}mas muito mais bonito. Eles também têm as mesmas sobrecargas.
smdrager
7
Como você acessa o objeto? Model.firstNamee seus semelhantes lançam uma exceção queobject doesn't have a 'firstName' property
ashes999 de
4
@ ashes999 você pode acessar via ViewData ... mas ajude a manter as coisas organizadas simplesmente criando um modelo específico para seu uso. Use-o uma vez e alguns podem considerá-lo um lance para cima, mas use-o mais vezes do que isso e é um acéfalo.
Ted
83

Esta é outra maneira de fazer isso se você quiser usar ViewData:

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

E para recuperar os valores passados:

@{
    string valuePassedIn = this.ViewData.ContainsKey("VariableName") ? this.ViewData["VariableName"].ToString() : string.Empty;
}
Garry English
fonte
Obrigado, sua resposta funcionou sem criar um modelo para isso.
alvarodms
De todos os exemplos, este é o único que funcionou totalmente para mim. obrigado
BrianLegg
Isso é o que eu procurava, sem modelo. obrigado :)
Anupam Roy
Excelente resposta - mas com MVC 4 use Html.RenderPartial em vez de Html.Partial
Graham Laight
24

Você precisa criar um modelo de vista. Algo assim deve servir ...

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

}

então, a partir de seu resultado de ação, passe o modelo

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

e você será capaz de acessar @Model.FirstNamee de @Model.LastNameacordo.

simonlchilds
fonte
13

certifique-se de adicionar {} ao redor de Html.RenderPartial, como:

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

não

@Html.RenderPartial("FullName", new { firstName = model.FirstName, lastName = model.LastName});
BlackTigerX
fonte
1
Como está a definição de sua vista parcial? Qual é a declaração @model? É anônimo ...
Elisabeth
sim, certifique-se de adicionar { }, eu perdi tempo até encontrar este artigo
shaijut
4

A seguir está funcionando para mim no 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 são
fonte
0

Somente:

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