Search code examples
asp.net-mvcpartial-viewsrenderpartialviewusercontrol

Rendering a derived partial view with Html.RenderPartial


Calling Html.RenderPartial("~/Views/Payments/MyControl.ascx"); from a view works if MyControl.ascx is a control that directly inherits System.Web.Mvc.ViewUserControl.

However, if the control inherits a new class that derives from System.Web.Mvc.ViewUserControl, the call to Html.RenderPartial("~/Views/Payments/MyDerivedControl.ascx"); fails, reporting that no such view exists.

Example derived System.Web.Mvc.ViewUserControl:

class MyDerivedControl : System.Web.Mvc.ViewUserControl
{
    public Method()
    {
        ViewData["SomeData"] = "test";
    }
}

Is there a workaround, or is there another way I should be doing this? Perhaps an HTML helper?


Solution

  • From MVC point of view it is not a good design to have your view provide data. Usually this is the responsibility of the controller. Depending on the context and what this data represents you could use an HTML helper or a write an action filter. Here's an example with a custom action filter:

    public class SomeDataActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            filterContext.Controller.ViewData["SomeData"] = "test";
        }
    }
    

    And then decorate your action with this filter:

    [SomeDataActionFilter]
    public ActionResult Index()
    {
        return View();
    }