【问题标题】:ASP.NET C#, returning objects to AngularASP.NET C#,将对象返回给 Angular
【发布时间】:2018-12-24 01:25:39
【问题描述】:

我正在为 Angular 前端编写 C# api 后端。我以前在其他项目中这样做过,以前我总是从 c# 返回一个对象,而在邮递员或 Angular 中我能够读取该对象。在 postman 中,它被整齐地格式化为 json。

例如,我曾经有一个class Person 和一个控制器PersonController。在PersonController 中,我可以有一个方法Get() 并且Get 会是这样的

public Person Get() {
    Person p = new Person();
    ...
    return p;
}

我应该打电话给 Angular 的 PersonController.Get,我会得到这个人。但是由于某种原因,现在我在一个新项目中这样做,我得到的只是[Person]——而不是可扩展的 json。

这是为什么?

我知道我看到了差异。开发人员花了一些时间将其作为字符串返回:

JavaScriptSerializer json = new JavaScriptSerializer()
            {
                MaxJsonLength = 3000;
            };
strJson = json.Serialize(model);
return strJson;

但我想返回实际对象。我发现解析它会慢得多。

编辑:

这是我的实际控制人:

 public class PersonController : Controller
 {
        private readonly IPersonService personService;

        public PersonController()
        {
            presonService =  new PersonService();
        }

        public async Task<JArray> Get(int? id)
        {
            var model = await personService.GetInfo(id, ConnHelper.ConnectionString());
            JArray a = (JArray)JToken.FromObject(model);
            return a;
            //return model;
        }

        public async Task<List<Person>> GetObject(int? id)
        {
                var model = await personService.GetInfo(id, ConnHelper.ConnectionString());                
                return model;
        }
}

【问题讨论】:

  • 向我们展示您的控制器方法
  • 我做到了。我写出来的想法完全一样。
  • 编辑您的问题并包含该控制器操作
  • 它就在那里:public Person Get(){ Person p = new Person(); ... 返回 p; }
  • 你在哪里找到序列化的代码?

标签: c# asp.net json angular


【解决方案1】:

因为你的控制器是一个普通的控制器,你应该返回 Json 如下:

public class PersonController : Controller
{
    private readonly IPersonService personService;

    public PersonController()
    {
        presonService =  new PersonService();
    }


    public async Task<JArray> Get(int? id)
    {
        var model = await personService.GetInfo(id, ConnHelper.ConnectionString());
        JArray a = (JArray)JToken.FromObject(model);
        return Json(a);
        //return model;
    }




public async Task<List<Person>> GetObject(int? id)
            {
                var model = await personService.GetInfo(id, ConnHelper.ConnectionString());                
                return Json(model);
            }
        }

【讨论】:

  • 普通控制器与其他控制器相比是什么意思?
  • 那个Json又是什么类?我试了一下,得到错误:无法将 json... 转换为类型 List...
  • 反对ApiController
  • Json 不是一个类,它是一个类似于 View() 的函数,用于普通视图
  • 我认为问题在于数据而不是 json 函数。您确定 GetInfo 正在返回数组吗?因为它有一个 id 作为参数,我相信它只返回一个项目
【解决方案2】:

当你只需要在你的 ASP.NET Web API 中支持 JSON 时,在你的 Global.asax 里面的 Application_Start() 中,添加这个

GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());

我认为这将是一个挖掘的好地方: https://www.strathweb.com/2013/06/supporting-only-json-in-asp-net-web-api-the-right-way/

【讨论】:

  • 这实际上没有帮助。
  • 任何其他想法@Praneet Nadkar
  • 添加此代码时发生了什么?您没有收到 JSON 响应?您可以在操作过滤器中将对象类型转换为 json。检查此:gist.github.com/brainded/8698865 了解如何将对象转换为 JSON。
  • 但是那个静态类只是帮助将对象作为字符串返回(Json 字符串,但是字符串)我想返回对象并在 javascript/angular 中处理解析。
  • 为什么要用JS或者angular解析?角度理解json对吗?你想传递结构
猜你喜欢
  • 1970-01-01
  • 2014-03-29
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 2019-07-07
  • 2011-12-30
  • 1970-01-01
相关资源
最近更新 更多