What you have done is probably the simplest and safest possible approach as it avoids attempting to mix WebForms and MVC contexts within the same web request.
The disadvantage of course is that you require 2 http requests to get the contents of the page.
If you wanted to render a simple MVC Partial View as part the aspx page itself, without requiring a separate request, you could try the following approach.
1) Create an HtmlHelper instance in your code behind. The following code is adapted from Access HtmlHelpers from WebForm when using ASP.NET MVC
protected HtmlHelper htmlHelper;
protected void Page_Load(object sender, EventArgs e)
{
var httpContext = new HttpContextWrapper(HttpContext.Current);
RouteData routeData = new RouteData();
routeData.Values["controller"] = "Dummy";
var controllerContext = new ControllerContext(httpContext, routeData, new DummyController());
var viewContext = new ViewContext(controllerContext, new WebFormView(controllerContext, "View"), new ViewDataDictionary(), new TempDataDictionary(), TextWriter.Null);
htmlHelper = new HtmlHelper(viewContext, new ViewDataBag());
}
private class ViewDataBag : IViewDataContainer
{
ViewDataDictionary viewData = new ViewDataDictionary();
public ViewDataDictionary ViewData
{
get
{
return viewData;
}
set
{
viewData = value;
}
}
}
private class DummyController : Controller
{
}
Note that this code is non-trivial and certainly feels very 'hacky'. You could put this in a base Page or base UserControl class if you are using it often.
In the .aspx file, you can now render a partial view by calling htmlHelper.Partial:
<div id="mvcPartial">
<%:htmlHelper.Partial("_SimplePartial") %>
</div>
I tested this with Web Forms 4.5 and MVC 5 and it works in simple cases. I can't be certain that it will work in all cases.