MVC 4 return JSON as ActionResult

早过忘川 提交于 2019-12-11 00:42:55

问题


i'm trying to get my apicontroller to work. But somehow i cannot return Json().

Here's the error message from the compiler:

Error CS0029 Cannot implicitly convert type 'System.Web.Http.Results.JsonResult<>' to 'System.Web.Mvc.JsonResult' Opten.Polyglott.Web D:\Development\git\Opten.Polyglott\src\Opten.Polyglott.Web\Controllers\NewsletterApiController.cs

I cannot explain why it cannot convert the Json() to the ActionResult even the Json()inherits ActionResult.

Here's my controller:

using MailChimp;
using MailChimp.Helper;
using Opten.Polyglott.Web.Models;
using Opten.Umbraco.Common.Extensions;
using System.Configuration;
using System.Web.Mvc;
using Umbraco.Core.Logging;
using Umbraco.Web.WebApi;

namespace Opten.Polyglott.Web.Controllers
{
    public class NewsletterApiController : UmbracoApiController
    {
        public ActionResult Subscribe(Newsletter newsletter)
        {
            bool isSuccessful = false;
            if (ModelState.IsValid)
            {
                isSuccessful = SubscribeEmail(newsletter.Email);
            }

            return Json(new { isSuccess = isSuccessful });
        }
    }
}

Thanks for any help.


回答1:


Your problem is within the usings as the UmbracoApiController most likely inherits from ApiController (from System.Web.Http) not Controller (from System.Web.Mvc) and thus they have different dependencies. To fix your problem first remove the

using System.Web.Mvc;

and put the

using System.Web.Http;

as for the return in this case that would be IHttpActionResult so you would have something as follows:

using MailChimp;
using MailChimp.Helper;
using Opten.Polyglott.Web.Models;
using Opten.Umbraco.Common.Extensions;
using System.Configuration;
using System.Web.Http;
using Umbraco.Core.Logging;
using Umbraco.Web.WebApi;

namespace Opten.Polyglott.Web.Controllers
{
    public class NewsletterApiController : UmbracoApiController
    {
        public IHttpActionResult Subscribe(Newsletter newsletter)
        {
            bool isSuccessful = false;
            if (ModelState.IsValid)
            {
                isSuccessful = SubscribeEmail(newsletter.Email);
            }

            return Json(new { isSuccess = isSuccessful });
        }
    }
}

Let me know if that works for you.




回答2:


It seems your Json is using class in System.Web.Http, not in System.Web.Mvc. In this case, you can use this code:

return new JsonResult{ isSuccess = isSuccessful };



回答3:


Add the following line in your WebApiConfig.cs file:

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));



回答4:


When using ActionResult using Response.StatusCode is a good practice:

public ActionResult SomeMethod()
{
    try
    {
        // ...
        // doing something here...
        // ...

        // success:
        Response.StatusCode = (int)HttpStatusCode.OK;
        return Json(new { responseText = "OK" });
    }
    catch
    {
        // error:
        Response.StatusCode = (int)HttpStatusCode.BadRequest;
        return Json(new { responseText = "ERROR" });
    }
}


来源:https://stackoverflow.com/questions/37133362/mvc-4-return-json-as-actionresult

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!