【问题标题】:MVC 4 return JSON as ActionResultMVC 4 将 JSON 作为 ActionResult 返回
【发布时间】:2016-05-10 08:43:41
【问题描述】:

我正在尝试让我的 apicontroller 工作。但不知何故我无法返回Json()

这是来自编译器的错误消息:

错误 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()inherits 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。我认为它需要一种类型
  • @user1490835 我的代码和这个有什么区别:stackoverflow.com/questions/227624/…
  • System.Web.Mvc.JsonResult 是您想要的。我不确定为什么“JSON”映射到 System.Web.Http.Results.JsonResult。您可以明确说明: return System.Web.Mvc.Json(new { isSuccess = isSuccessful });

标签: c# json asp.net-mvc-4 controller asp.net-apicontroller


【解决方案1】:

您的问题在使用中,因为 UmbracoApiController 很可能继承自 ApiController (from System.Web.Http) 而不是 Controller (from 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,谢谢!
【解决方案2】:

您的 Json 似乎在 System.Web.Http 中使用类,而不是在 System.Web.Mvc 中。在这种情况下,您可以使用以下代码:

return new JsonResult{ isSuccess = isSuccessful };

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      在您的 WebApiConfig.cs 文件中添加以下行:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-24
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        相关资源
        最近更新 更多