MVC 4返回JSON作为ActionResult

3
我正在尝试让我的API控制器正常工作。但是,不知何故,我无法返回Json()
以下是编译器的错误消息:

Error CS0029 无法隐式转换类型'System.Web.Http.Results.JsonResult<>'到 'System.Web.Mvc.JsonResult' Opten.Polyglott.Web D:\Development\git\Opten.Polyglott\src\Opten.Polyglott.Web\Controllers\NewsletterApiController.cs

我无法解释为什么无法将Json()转换为ActionResult,即使Json()继承了ActionResult
以下是我的控制器:
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 });
        }
    }
}

感谢你的帮助。

你的方法返回了一个特定类型的JSON对象,但是你的返回类型却是JSONResult。我认为它期望在那里有一个类型。 - Baahubali
@user1490835,我的代码和这个有什么区别:https://dev59.com/y3VC5IYBdhLWcg3wpSzf - NinjaOnSafari
System.Web.Mvc.JsonResult 是您想要的。我不确定为什么“JSON”会映射到 System.Web.Http.Results.JsonResult。您可以明确地指定: return System.Web.Mvc.Json(new { isSuccess = isSuccessful }); - CooncilWorker
4个回答

14
你的问题在于使用了错误的命名空间。很可能UmbracoApiController 继承自 ApiController (来自System.Web.Http) 而不是 Controller (来自System.Web.Mvc),因此它们具有不同的依赖项。为解决此问题,首先删除以下代码行:using System.Web.Mvc;,然后添加:using System.Web.Http;。在这种情况下,返回类型应该是 IHttpActionResult,所以你应该有如下内容:
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 });
        }
    }
}

如果这样对你有用,请告诉我。


你关于ApiController(不是Controller)的解释帮助我理解了为什么所有的响应都自动变成了JSON,谢谢! - RuudvK

9

看起来你的Json是使用System.Web.Http中的类,而不是System.Web.Mvc中的类。在这种情况下,你可以使用以下代码:

return new JsonResult{ isSuccess = isSuccessful };

1

使用ActionResult时,使用Response.StatusCode是一种好的实践:

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" });
    }
}

0
请在您的WebApiConfig.cs文件中添加以下行:
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接