97

Suppose that I have this partial view:

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

which is accessible through a child only action like:

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

}

And I want to use this partial view inside another view with:

@Html.RenderPartial("FullName")

In other words, I want to be able to pass firstName ans lastName from view to partial view. How should I do that?

Dariusz Woźniak
  • 9,640
  • 6
  • 60
  • 73
Saeed Neamati
  • 35,341
  • 41
  • 136
  • 188

8 Answers8

94

Here is another way to do it if you want to use ViewData:

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

And to retrieve the passed in values:

@{
    string valuePassedIn = this.ViewData.ContainsKey("VariableName") ? this.ViewData["VariableName"].ToString() : string.Empty;
}
Garry English
  • 5,070
  • 1
  • 36
  • 23
  • 1
    Thanks, your answer did the trick without creating a model for this. – alvarodms Oct 13 '15 at 18:48
  • Out of all the examples, this is the only one that fully worked for me. thanks – BrianLegg Nov 17 '15 at 21:05
  • This is what i was looking for, no model. thank you :) – Anupam Roy Dec 01 '15 at 10:04
  • Excellent answer - but with MVC 4 use Html.RenderPartial instead of Html.Partial – Graham Laight Jul 26 '16 at 11:01
  • 1
    I had to use `new ViewDataDictionary(ViewData) {` to get it to work: https://stackoverflow.com/a/43136848/1741690 so: `await Html.RenderPartialAsync("~/PathToYourView.cshtml", null, new ViewDataDictionary(ViewData) { { "VariableName", "some value" } } );` – SharpC Jun 09 '21 at 20:06
  • @SharpC, It solved the error showing in viedatadictionary but i am unable to get the value in the partial view – sumitkhatrii Dec 05 '22 at 06:25
  • @SharpC should be because you were using AspNetCore. ViewDataDictionary is available in System.Web.Mvc and Microsoft.AspNetCore.Mvc.ViewFeatures with different constructors. – ccalboni May 22 '23 at 09:23
81

Use this overload (RenderPartialExtensions.RenderPartial on MSDN):

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

so:

@{Html.RenderPartial(
    "FullName",
    new { firstName = model.FirstName, lastName = model.LastName});
}
Michał Powaga
  • 22,561
  • 8
  • 51
  • 62
David Wick
  • 7,055
  • 2
  • 36
  • 38
  • 1
    Well, tried that, but I'm getting _The best overloaded method match for 'System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)' has some invalid arguments_ error. How should I implement the controller method? Should it have input parameters? – Saeed Neamati Jul 01 '11 at 15:06
  • The RenderPartial method returns void, as the views render directly into the output stream, not into a string. I edited my answer to fix this issue. – David Wick Jul 01 '11 at 16:07
  • did you add the {} around the call? it needs to be @{Html.RenderPartial("FullName", new { firstName = model.FirstName, lastName = model.LastName});} not @Html.RenderPartial("FullName", new { firstName = model.FirstName, lastName = model.LastName}); – BlackTigerX Jul 01 '11 at 16:18
  • That did the trick. But it's so messy and dirty. Why should it be wrapped inside another pair of curly braces? – Saeed Neamati Jul 02 '11 at 07:16
  • 23
    So you passed parameter like this, how do you access it in partial view? – Burjua May 11 '12 at 09:38
  • 10
    You also don't need the brackets. `@Html.Partial()` is the same as `@{Html.RenderPartial();}` but much prettier. They have the same overloads as well. – smdrager Jun 21 '12 at 18:03
  • 7
    How do you access the object? `Model.firstName` and their like throw an exception that `object doesn't have a 'firstName' property` – ashes999 Apr 20 '13 at 01:22
  • As to whether or not you need the brackets, no you don't. However, using the brackets is *slightly* more optimal because it is written directly to the response stream. – Ted Nov 07 '13 at 20:19
  • 4
    @ashes999 you can access via ViewData... but help keep things tidy by simply creating a model specific to your usage. Use it once and some may consider it a toss up, but use it any more times than that and it's a no-brainer. – Ted Nov 07 '13 at 20:35
  • Can I add `Html.RenderPartial` as an `onclick` event for a button? – Dylan Czenski May 13 '16 at 19:57
25

You need to create a view model. Something like this should do...

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

}

then from your action result pass the model

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

and you will be able to access @Model.FirstName and @Model.LastName accordingly.

Matt
  • 3,617
  • 2
  • 27
  • 39
Simon
  • 2,810
  • 2
  • 18
  • 23
15

make sure you add {} around Html.RenderPartial, as:

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

not

@Html.RenderPartial("FullName", new { firstName = model.FirstName, lastName = model.LastName});
BlackTigerX
  • 6,006
  • 7
  • 38
  • 48
  • 2
    How does the definition of your Partial View looks? What is the @model declaration? Its anonymous... – Elisabeth Mar 17 '15 at 16:06
  • yes make sure to add `{ }`, i wasted time until i found [this](http://www.quickstepit.net/html-renderpartial-void-erro/) article – Shaiju T Oct 25 '15 at 13:13
6

Following is working for me on dotnet 1.0.1:

./ourView.cshtml

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

./_ourPartial.cshtml

<h1>@this.ViewData["hi"]</h1>
Evgenia Karunus
  • 10,715
  • 5
  • 56
  • 70
1

Just:

@Html.Partial("PartialName", Model);
0
@{
            Html.RenderPartial("_partialViewName", null, new ViewDataDictionary { { "Key", "Value" } });
        } 

in the place you want to show your partial,

 @{
    string valuePassedIn = this.ViewData.ContainsKey("Key") ? this.ViewData["Key"].ToString() : string.Empty;
}

in the partialview rendered,

To use the valuePassedIn --> @valuePassedIn

V_G_
  • 1
  • 3
  • This does not provide an answer to the question. Once you have sufficient [reputation](https://stackoverflow.com/help/whats-reputation) you will be able to [comment on any post](https://stackoverflow.com/help/privileges/comment); instead, [provide answers that don't require clarification from the asker](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i-do-instead). – Emmanuel Ponnudurai Sep 04 '21 at 04:18
0

I just came across this question, and I have a similar situation

my problem is as follows : I have more than one variable I need to pass to the partial view I created

The solution I have created

@{
await Html.RenderPartialAsync("YourPartialViewName",new { NumberOfProducts = ViewData["NumberOfProducts"], UserName = ViewData["UserName"] });
}

In the above code, I created an anonymous object and sent it to the view and the following code is to explain how to retrieve the data that sent through this object

     <span>
          @Model.UserName
      </span>

     <span>
          @Model.NumberOfProducts
      </span>

hope this helps