26

I two database entities that i need to represent and i need to output them in a single page.

I have something like this

Views Def ViewA ViewB Test ViewC

I want to ViewC to display ViewA, which displays ViewB.

Right now i'm using something like this:

// View C
<!-- bla -->
<% Html.RenderPartial(Url.Content("../Definition/DefinitionDetails"), i); %>


// View A
<!-- bla -->
<% Html.RenderPartial(Url.Content("../Definition/DefinitionEditActions")); %>

Is there a better to do this? I find that linking with relative pathnames can burn you. Any tips?

Any chance I can make somehtiing like...

Html.RenderPartial("Definition","DefinitionDetails",i); ?

Thanks for the help

Funka
  • 4,258
  • 2
  • 24
  • 27
George Silva
  • 3,454
  • 10
  • 39
  • 64

4 Answers4

48

this is works for me!

@Html.Partial("~/Views/NewsFeeds/NewsFeedPartial.cshtml")
Andrew Barber
  • 39,603
  • 20
  • 94
  • 123
35

You can refer to Views with full paths, like:

Html.RenderPartial("~/Views/Definition/DefinitionDetails")

Even better, use the T4MVC library, which does the above and makes it (quasi-) strongly-typed. You can refer to any view from any controller or view. You use it like this:

Html.RenderPartial(MVC.Definition.Views.DefinitionDetails)

or

Html.RenderPartial(MVC.Definition.Views.DefinitionDetails, myModel)
Matt Sherman
  • 8,298
  • 4
  • 37
  • 57
  • 4
    I've found that you have to add the '.ascx' to the end of the path with the first method. (This might just be for a particular project setup) – andypaxo Mar 11 '11 at 17:09
  • 2
    Just to specify, we're talking about the `Html.RenderPartial` overload in `System.Web.Mvc.Html.RenderPartialExtenstions` not `MvcContrib.UI.InputBuilder.Views.HtmlExtensions` nor `Microsoft.Web.Mvc.Html.HtmlHelperExtensions`. Sometimes Resharper gives you too many choices. – flipdoubt Jan 06 '12 at 17:42
  • 3
    Yes I tried the first method will produce error, it supposed to have the file extension. So it should be `Html.RenderPartial("~/Views/Controller/Action.ext")` where ext can be aspx, ascx, cshtml or vbhtml. – CallMeLaNN Jul 11 '12 at 15:42
  • This answer is not quiet right. If you supply a path you need to supply the extension as well. if you do not supply a path you must NOT supply an extension. Details answer added below to clarify the options. – iCollect.it Ltd Feb 06 '14 at 12:12
  • Yes @CallMeLaNN you are right first method gives an error "The partial view '~/Views/Definition/DefinitionDetails' was not found" and it can be removed by adding ext at the end – Dragon Jul 29 '15 at 13:41
14

Just to clarify which options work exactly:

1) The extension of the view file is required if you supply a path.

2) If you do not supply a path, do not supply the extension.

The examples below assume cshtml files.

Use RenderPartial in a code block:

// This looks in default view folder, then shared, checking for .aspx, .cshtml etc
Html.RenderPartial("DefinitionDetails"); 

// This looks in specified path and requires the extension
Html.RenderPartial("~/Views/Definition/DefinitionDetails.cshtml");

Use Partial for inline Razor syntax:

// This looks in default view folder, then shared, checking for .aspx, .cshtml etc
@Html.Partial("DefinitionDetails")

// This looks in specified path and requires the extension
@Html.Partial("~/Views/Definition/DefinitionDetails.cshtml")

Note: Apparently RenderPartial is slightly faster than Partial, but I also expect fully pathed names will be a faster than letting MVC search for the file.

If you are producing partials in a loop (i.e. from a collection in your view model), it is likely you will need to pass through specific viewmodels:

e.g.

   @foreach (var group in orderedGroups)
   {
       Html.RenderPartial("~/Views/ControllerName/ViewName.cshtml", group);
   }

I just had to do all this on a project and found the marked answer a little misleading.

iCollect.it Ltd
  • 92,391
  • 25
  • 181
  • 202
1

Could you not copy the partials into the shared folder then just do:

<% Html.RenderPartial("DefinitionDetails", i); %> and

<% Html.RenderPartial("DefinitionEditActions"); %>

ridecar2
  • 1,968
  • 16
  • 34