MVCContrib portable areas not working from HtmlExtensions, MVC 3

1.4k views Asked by At

I just implemented MVCContrib's Portable Area feature and it works fine. I can open it using: http://localhost/projectname/portableAreaName, but this portable area is not working if i render it using the HtmlHelper extension method like this:

public static void  RenderHtmlWidget(this HtmlHelper Html)
{
        Html.RenderAction("Index", "HtmlWidget", new {area = "HtmlWidget"});
}

And calling the helper method in the view as such:

@using Project.Widgets.HtmlWidget;
@{Html.RenderHtmlWidget();}

I'm getting an error: The view 'Index' or its master was not found or no view engine supports the searched locations. In the possible location list there are no ~/areas/... defined. But I can render my HtmlWidget successfully with this the same line of code in the view:

@{Html.RenderAction("Index", "HtmlWidget", new { area = "HtmlWidget" });}

What am I doing wrong and how should I use the HtmlHelper extensions correctly with the MVCContrib portable areas feature?

1

There are 1 answers

0
Mattygabe On

There are a few things that may be causing this.

  • In the calling/parent project where you use the helper method to invoke your portable area, do you have a Web.config file in the /Areas/ folder? If not, you must copy the Web.config found in the /Views/ folder of the same project, and simply place the new copy in the /Areas/ folder as well.
  • In the Registration class file in your portable area project, after you call MapRoute in the "RegisterArea" method, are you calling "RegisterAreaEmbeddedResources();"?
  • Is each view in your portable area project made to be an embedded resource as opposed to content? Select a View in the Solution Explorer and hit F4, "Build Action" should be set to "Embedded Resource", but it defaults to "Content"
  • You also need to make sure that both the Portable project and the consuming project reference the same version of MvcContrib, but that they also utilize the same version of ASP.NET MVC. If your area is referenced in multiple projects, each based off of a different version of MVC (not likely, but possible depending on the situation), your area must use whatever version of MVC the consuming project uses.
  • I'd also suggest using Phil Haack's .NET Routing Debugger - its a single DLL file that you reference in the consuming application and add a single line to your ApplicationStart() in your Global.asax.cs. This becomes incredibly helpful in determining if your portable area is being correctly registered with the base project - and helps you cut to the chase.