Async Controller Returning "System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult]"
Asked Answered
I

2

0

I'm trying to work out why Umbraco 7.2.4 just doesn't seem to handle asynchronous tasks in my ASP.NET MVC controller. I feel like I've read almost every possible stack overflow and umbraco q&a, and tried many possible methods to try narrow down the problem. This is both for Umbraco 7 & MVC 4 and & MVC 5. It works just fine in an MVC project without Umbraco.

HomeController.cs:

using System.Threading.Tasks;
using System.Web.Mvc;
using Umbraco.Web.Models;
using Umbraco.Web.Mvc;

namespace Umbraco.Async.Website.Controllers
{
    public class HomeController : RenderMvcController
    {
        public new async Task<ActionResult> Index(RenderModel model)
        {
            var menuModel = new HomeViewModel(model);
            await Task.Delay(1000);
            return View("Home", menuModel);
        }
    }

    public class HomeViewModel : RenderModel
    {
        public string Test = "Pizza is awesome!!!!";

        public HomeViewModel(RenderModel model)
            : base(model.Content, model.CurrentCulture)
        {

        }
    }
}

Home.cshtml:

@*@inherits Umbraco.Web.Mvc.UmbracoTemplatePage*@
@inherits UmbracoViewPage<Umbraco.Async.Website.Controllers.HomeViewModel>
@{
    Layout = null;
}

<h1>@Model.Test</h1>

In the end the browser shows no rendered view, and just the text string:

System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult]

Imprecate answered 11/5, 2015 at 11:32 Comment(4)
See this question elsewhere on SO #23007476Murderous
Hi @ProNotion, thanks for that, I've tried both solutions in that question on multiple projects (MVC4, MVC5) before with no luck. I will add a comment to their question. Cheers!Imprecate
....Also I've tried with a SurfaceController (as in #23007476) as well as my RenderMvcController. (extra info that might be useful)Imprecate
@legas: Are you running on .NET 4.5 or newer?Frayne
P
0

Do you have this key in your web.config file? If not, please add it and then try.

<appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
Presumable answered 11/5, 2015 at 11:54 Comment(0)
M
0

I've raised an issue with Umbraco for this issue as I have ben struggling with this for quite a while. I have written an article on a solution here but in a nutshell you can use this instead:

public async Task<ActionResult> Home(RenderModel model)
{
    var menuModel = new HomeViewModel(model);
    await Task.Delay(1000);
    return View("Home", menuModel);
}

The difference being that the Home action takes precedence over the failing Index action as it is routed from the template name not the document type alias.

Macaluso answered 17/10, 2015 at 14:1 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.