webapi 数组 返回list_webapi 后台接受json数组转化为list - CSDN
精华内容
参与话题
  • 本篇涉及ASP.NET Web API中的返回数据合适和依赖注入。获取数据   public IEnumerable<Food> Get() { var results = reop.GetAllFoods() .OrderBy(f => f.Description) .Take(25) ...

     

    本篇涉及ASP.NET Web API中的返回数据合适和依赖注入。

    获取数据

     

    public IEnumerable<Food> Get()
    {
        var results = reop.GetAllFoods()
            .OrderBy(f => f.Description)
            .Take(25)
            .ToList();
        return results;
    }

     

    默认情况下,ASP.NET API控制器方法返回json数据格式。在请求的时候可以要求其它的格式,比如:

    User-Agent:Fiddler
    Host:localhost:8000
    Accept:text/xml

    请求数据也可以要求多个格式,比如:

    User-Agent:Fiddler
    Host:localhost:8000
    Accept:text/xml, applicaiton/json, text/html

    此时,服务端首先查看客户端所能接受的类型数组,然后与服务端能接受的类型数组匹配,而服务端优先默认返回json,所以,以上请求返回json数据。返回的json数据类似如下:

    Description:'dddd'

    也就是首字母大写。如何让首字母变成小写呢?

    当然可以通过让视图模型的属性名第一个字母小写而实现。不过,还可以自定义Formatter。

    自定义返回数据的格式

    在WebApiConfig.cs文件中。

     

    using Newtonsoft.Json.Serialization;
    
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new {id = RouteParameter.Optional}
            );
            
            var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().FirstOrDefault();
            jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        }
    }

     

    此时, 返回的数据格式大致是:

    description:'dddd'

    依赖注入 Dependency Injection

    比如在controller中,我们希望通过构造函数注入repoitory接口。

     

    public class FoodsController : ApiController
    {
        IFoodRepository _reop;
        
        public FoodsController(IFoodRepository reop)
        {
            _repo = repo;
        }
    }

     

    此时运行会报错:System.InvalidOperaitonException

    如何让API支持这种通过构造函数的依赖注入呢?

    安装Ninject.MVC3

    安装后,会在App_Data文件中多了一个NinjectWebCommon类。在其RegisterServices中可以注册依赖。

     

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IFoodRepository>().To<FoodRepository>();
    }

     

    在这里,我们告诉IOC Container, 当有请求过来要求IReposiotory的时候,就返回Repository实例。

    最后,我们需要告诉API Ninject的存在。


    NinjectWebCommon类的CreateKernel方法中。

    安装WebApiContrib.IoC.Ninject

     

    using WebApiContrib.IoC.Ninject;
    ...
    
    private static IKernel Createkernel()
    {
        var kernel = new StandardKernel();
        
        //支持API
        GlobalConfiguraiton.Configuration.DependencyResolver = new NinjectResolver(kernel);
    }

     

    展开全文
  • C# WebApi 接口传参详解

    千次阅读 2018-07-29 09:26:19
    这篇文章主要介绍了C# WebApi 接口传参详解,本篇打算通过get、post、put、delete四种请求方式分别谈谈基础类型(包括int/string/datetime等)、实体、数组等类型的参数如何传递。感兴趣的小伙伴们可以参考一下   ...

     

    这篇文章主要介绍了C# WebApi 接口传参详解,本篇打算通过get、post、put、delete四种请求方式分别谈谈基础类型(包括int/string/datetime等)、实体、数组等类型的参数如何传递。感兴趣的小伙伴们可以参考一下

     

    前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料。如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法,算是一个笔记,也希望能帮初学者少走弯路。本篇针对初初使用WebApi的同学们,比较基础,有兴趣的且看看。

    本篇打算通过get、post、put、delete四种请求方式分别谈谈基础类型(包括int/string/datetime等)、实体、数组等类型的参数如何传递。

    一、get请求

    对于取数据,我们使用最多的应该就是get请求了吧。下面通过几个示例看看我们的get请求参数传递。

    1、基础类型参数

    ?

    1

    2

    3

    4

    5

    [HttpGet]

    public string GetAllChargingData(int id, string name)

    {

      return "ChargingData" + id;

    }

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    $.ajax({

        type: "get",

        url: "http://localhost:27221/api/Charging/GetAllChargingData",

        data: { id: 1, name: "Jim", bir: "1988-09-11"},

        success: function (data, status) {

          if (status == "success") {

            $("#div_test").html(data);

          }

        }

      });

    参数截图效果

    这是get请求最基础的参数传递方式,没什么特别好说的。

    2、实体作为参数

    如果我们在get请求时想将实体对象做参数直接传递到后台,是否可行呢?我们来看看。

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    public class TB_CHARGING

      {

        /// <summary>

        /// 主键Id

        /// </summary>

        public string ID { get; set; }

     

        /// <summary>

        /// 充电设备名称

        /// </summary>

        public string NAME { get; set; }

     

        /// <summary>

        /// 充电设备描述

        /// </summary>

        public string DES { get; set; }

     

        /// <summary>

        /// 创建时间

        /// </summary>

        public DateTime CREATETIME { get; set; }

      }

    ?

    1

    2

    3

    4

    5

    [HttpGet]

    public string GetByModel(TB_CHARGING oData)

    {

       return "ChargingData" + oData.ID;

    }

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    $.ajax({

        type: "get",

        url: "http://localhost:27221/api/Charging/GetByModel",

        contentType: "application/json",

        data: { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },

        success: function (data, status) {

          if (status == "success") {

            $("#div_test").html(data);

          }

        }

      });

    测试结果

    由上图可知,在get请求时,我们直接将json对象当做实体传递后台,后台是接收不到的。这是为什么呢?我们来看看对应的http请求

    原来,get请求的时候,默认是将参数全部放到了url里面直接以string的形式传递的,后台自然接不到了。

    原因分析:还记得有面试题问过get和post请求的区别吗?其中有一个区别就是get请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),而post请求则是放在http协议包的包体中。

    根据园友们的提议,Get请求的时候可以在参数里面加上[FromUri]即可直接得到对象。还是贴上代码:

    ?

    1

    2

    3

    4

    5

    6

    7

    var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" };

      $.ajax({

        type: "get",

        url: "http://localhost:27221/api/Charging/GetAllChargingData",

        data: postdata,

        success: function (data, status) { }

      });

    ?

    1

    2

    3

    4

    5

    [HttpGet]

    public string GetAllChargingData([FromUri]TB_CHARGING obj)

    {

      return "ChargingData" + obj.ID;

    }

    得到结果:

    如果你不想使用[FromUri]这些在参数里面加特性的这种“怪异”写法,也可以采用先序列化,再在后台反序列的方式。

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    $.ajax({

        type: "get",

        url: "http://localhost:27221/api/Charging/GetByModel",

        contentType: "application/json",

        data: { strQuery: JSON.stringify({ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }) },

        success: function (data, status) {

          if (status == "success") {

            $("#div_test").html(data);

          }

        }

      });

    ?

    1

    2

    3

    4

    5

    6

    [HttpGet]

        public string GetByModel(string strQuery)

        {

          TB_CHARGING oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery);

          return "ChargingData" + oData.ID;

        }

    这样在后台得到我们序列化过的对象,再通过反序列化就能得到对象。

    在url里面我们可以看到它自动给对象加了一个编码:

    至于还有园友们提到http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api的model binder这种方式,博主看了下,觉得略复杂。有兴趣的也可以试试。至于用哪一种方式传递对象,园友们可以自行选择。

    3、数组作为参数

    一般get请求不建议将数组作为参数,因为我们知道get请求传递参数的大小是有限制的,最大1024字节,数组里面内容较多时,将其作为参数传递可能会发生参数超限丢失的情况。

    4、“怪异”的get请求

    为什么会说get请求“怪异”呢?我们先来看看下面的两种写法对比。

    (1)WebApi的方法名称以get开头

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    $.ajax({

        type: "get",

        url: "http://localhost:27221/api/Charging/GetByModel",

        contentType: "application/json",

        data: { strQuery: JSON.stringify({ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }) },

        success: function (data, status) {

          if (status == "success") {

            $("#div_test").html(data);

          }

        }

      });

    ?

    1

    2

    3

    4

    5

    6

    [HttpGet]

        public string GetByModel(string strQuery)

        {

          TB_CHARGING oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery);

          return "ChargingData" + oData.ID;

        }

    这是标准写法,后台加[HttpGet],参数正常得到:

    为了对比,我将[HttpGet]去掉,然后再调用

    ?

    1

    2

    3

    4

    5

    6

    //[HttpGet]

        public string GetByModel(string strQuery)

        {

          TB_CHARGING oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery);

          return "ChargingData" + oData.ID;

        }

    貌似没有任何问题!有人就想,那是否所有的get请求都可以省略掉[HttpGet]这个标注呢。我们试试便知。

    (2)WebApi的方法名称不以get开头

    我们把之前的方法名由GetByModel改成FindByModel,这个再正常不过了,很多人查询就不想用Get开头,还有直接用Query开头的。这个有什么关系吗?有没有关系,我们以事实说话。

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    $.ajax({

        type: "get",

        url: "http://localhost:27221/api/Charging/FindByModel",

        contentType: "application/json",

        data: { strQuery: JSON.stringify({ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }) },

        success: function (data, status) {

          if (status == "success") {

            $("#div_test").html(data);

          }

        }

      });

    ?

    1

    2

    3

    4

    5

    6

    [HttpGet]

        public string FindByModel(string strQuery)

        {

          TB_CHARGING oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery);

          return "ChargingData" + oData.ID;

        }

    貌似又可行,没有任何问题啊。根据上面的推论,我们去掉[HttpGet]也是可行的,好,我们注释掉[HttpGet],运行起来试试。

    结果是不进断点,有些人不信,我们在浏览器里面看看http请求:

    呵呵,这就奇怪了,就改了个方法名,至于这样么?还真至于!

    博主的理解是:方法名以Get开头,WebApi会自动默认这个请求就是get请求,而如果你以其他名称开头而又不标注方法的请求方式,那么这个时候服务器虽然找到了这个方法,但是由于请求方式不确定,所以直接返回给你405——方法不被允许的错误。

    最后结论:所有的WebApi方法最好是加上请求的方式([HttpGet]/[HttpPost]/[HttpPut]/[HttpDelete]),不要偷懒,这样既能防止类似的错误,也有利于方法的维护,别人一看就知道这个方法是什么请求。

    这也就是为什么很多人在园子里面问道为什么方法名不加[HttpGet]就调用不到的原因!

    二、post请求

    在WebApi的RESETful风格里面,API服务的增删改查,分别对应着http的post/delete/put/get请求。我们下面就来说说post请求参数的传递方式。

    1、基础类型参数

    post请求的基础类型的参数和get请求有点不一样,我们知道get请求的参数是通过url来传递的,而post请求则是通过http的请求体中传过来的,WebApi的post请求也需要从http的请求体里面去取参数。

    (1)错误的写法

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    $.ajax({

        type: "post",

        url: "http://localhost:27221/api/Charging/SaveData",

        data: { NAME: "Jim" },

        success: function (data, status) {

          if (status == "success") {

            $("#div_test").html(data);

          }

        }

      });

    ?

    1

    2

    3

    4

    5

    [HttpPost]

    public bool SaveData(string NAME)

    {

      return true;

    }

    这是一种看上去非常正确的写法,可是实际情况是:

    (2)正确的用法

    ?

    1

    2

    3

    4

    5

    6

    $.ajax({

        type: "post",

        url: "http://localhost:27221/api/Charging/SaveData",

        data: { "": "Jim" },

        success: function (data, status) {}

      });

    ?

    1

    2

    3

    4

    5

    [HttpPost]

       public bool SaveData([FromBody]string NAME)

       {

         return true;

       }

    这是一种另许多人头痛的写法,但是没办法,这样确实能得到我们的结果:

    我们一般的通过url取参数的机制是键值对,即某一个key等于某一个value,而这里的FromBody和我们一般通过url取参数的机制则不同,它的机制是=value,没有key的概念,并且如果你写了key(比如你的ajax参数写的{NAME:"Jim"}),后台反而得到的NAME等于null。不信你可以试试。

    上面讲的都是传递一个基础类型参数的情况,那么如果我们需要传递多个基础类型呢?按照上面的推论,是否可以([FromBody]string NAME, [FromBody]string DES)这样写呢。试试便知。

    (1)错误写法

    ?

    1

    2

    3

    4

    5

    6

    $.ajax({

        type: "post",

        url: "http://localhost:27221/api/Charging/SaveData",

        data: { "": "Jim","":"备注" },

        success: function (data, status) {}

      });

    ?

    1

    2

    3

    4

    5

    [HttpPost]

       public bool SaveData([FromBody]string NAME, [FromBody] string DES)

       {

         return true;

       }

    得到结果

    这说明我们没办法通过多个[FromBody]里面取值,此法失败。

    (2)正确用法

    既然上面的办法行不通,那我们如何传递多个基础类型的数据呢?很多的解决办法是新建一个类去包含传递的参数,博主觉得这样不够灵活,因为如果我们前后台每次传递多个参数的post请求都去新建一个类的话,我们系统到时候会有多少个这种参数类?维护起来那是相当的麻烦的一件事!所以博主觉得使用dynamic是一个很不错的选择。我们来试试。

    ?

    1

    2

    3

    4

    5

    6

    7

    $.ajax({

        type: "post",

        url: "http://localhost:27221/api/Charging/SaveData",

        contentType: 'application/json',

        data: JSON.stringify({ NAME: "Jim",DES:"备注" }),

        success: function (data, status) {}

      });

    ?

    1

    2

    3

    4

    5

    6

    [HttpPost]

        public object SaveData(dynamic obj)

        {

          var strName = Convert.ToString(obj.NAME);

          return strName;

        }

    通过dynamic动态类型能顺利得到多个参数,省掉了[FromBody]这个累赘,并且ajax参数的传递不用使用"无厘头"的{"":"value"}这种写法,有没有一种小清新的感觉~~有一点需要注意的是这里在ajax的请求里面需要加上参数类型为Json,即contentType: 'application/json',这个属性。

    (3)推荐用法

    通过上文post请求基础类型参数的传递,我们了解到了dynamic的方便之处,为了避免[FromBody]这个累赘和{"":"value"}这种"无厘头"的写法。博主推荐所有基础类型使用dynamic来传递,方便解决了基础类型一个或多个参数的传递,示例如上文。如果园友们有更好的办法,欢迎讨论。

    2、实体作为参数

    (1)单个实体作为参数

    上面我们通过dynamic类型解决了post请求基础类型数据的传递问题,那么当我们需要传递一个实体作为参数该怎么解决呢?我们来看下面的代码便知:

    ?

    1

    2

    3

    4

    5

    6

    $.ajax({

        type: "post",

        url: "http://localhost:27221/api/Charging/SaveData",

        data: { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },

        success: function (data, status) {}

      });

    ?

    1

    2

    3

    4

    5

    [HttpPost]

        public bool SaveData(TB_CHARGING oData)

        {

          return true;

        }

    得到结果

    原理解释:使用实体作为参数的时候,前端直接传递普通json,后台直接使用对应的类型去接收即可,不用FromBody。但是这里需要注意的一点就是,这里不能指定contentType为appplication/json,否则,参数无法传递到后台。我们来看看它默认的contentType是什么:

    为了弄清楚原因,博主查了下http的Content-Type的类型。看到如下说明:

    • application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式);
    • application/json : JSON数据格式

    也就是说post请求默认是将表单里面的数据的key/value形式发送到服务,而我们的服务器只需要有对应的key/value属性值的对象就可以接收到。而如果使用application/json,则表示将前端的数据以序列化过的json传递到后端,后端要把它变成实体对象,还需要一个反序列化的过程。按照这个逻辑,那我们如果指定contentType为application/json,然后传递序列化过的对象应该也是可以的啊。博主好奇心重,还是打算一试到底,于是就有了下面的代码:

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" };

      $.ajax({

        type: "post",

        url: "http://localhost:27221/api/Charging/SaveData",

        contentType: 'application/json',

        data: JSON.stringify(postdata),

        success: function (data, status) {}

      });

    ?

    1

    2

    3

    4

    5

    [HttpPost]

       public bool SaveData(TB_CHARGING lstCharging)

       {

         return true;

       }

    得到结果:

    尝试成功,也就是说,两种写法都是可行的。如果你指定了contentType为application/json,则必须要传递序列化过的对象;如果使用post请求的默认参数类型,则前端直接传递json类型的对象即可。

    (2)实体和基础类型一起作为参数传递

    有些时候,我们需要将基础类型和实体一起传递到后台,这个时候,我们神奇的dynamic又派上用场了。

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" };

      $.ajax({

        type: "post",

        url: "http://localhost:27221/api/Charging/SaveData",

        contentType: 'application/json',

        data: JSON.stringify({ NAME:"Lilei", Charging:postdata }),

        success: function (data, status) {}

      });

    ?

    1

    2

    3

    4

    5

    6

    7

    [HttpPost]

        public object SaveData(dynamic obj)

        {

          var strName = Convert.ToString(obj.NAME);

          var oCharging = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(Convert.ToString(obj.Charging));

          return strName;

        }

    得到结果:

    原理也不用多说,同上。

    3、数组作为参数

    (1)基础类型数组

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    var arr = ["1", "2", "3", "4"];

      $.ajax({

        type: "post",

        url: "http://localhost:27221/api/Charging/SaveData",

        contentType: 'application/json',

        data: JSON.stringify(arr),

        success: function (data, status) { }

      });

    ?

    1

    2

    3

    4

    5

    [HttpPost]

       public bool SaveData(string[] ids)

       {

         return true;

       }

    得到结果:

    (2)实体集合

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    var arr = [

        { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },

        { ID: "2", NAME: "Lilei", CREATETIME: "1990-12-11" },

        { ID: "3", NAME: "Lucy", CREATETIME: "1986-01-10" }

      ];

      $.ajax({

        type: "post",

        url: "http://localhost:27221/api/Charging/SaveData",

        contentType: 'application/json',

        data: JSON.stringify(arr),

        success: function (data, status) {}

      });

    ?

    1

    2

    3

    4

    5

    [HttpPost]

        public bool SaveData(List<TB_CHARGING> lstCharging)

        {

          return true;

        }

    得到结果:

    4、后台发送请求参数的传递

    上面写了那么多,都是通过前端的ajax请求去做的,我们知道,如果调用方不是web项目,比如Android客户端,可能需要从后台发送http请求来调用我们的接口方法,如果我们通过后台去发送请求是否也是可行的呢?我们以实体对象作为参数来传递写写代码试一把。

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    public void TestReques()

        {

           //请求路径

          string url = "http://localhost:27221/api/Charging/SaveData";

     

          //定义request并设置request的路径

          WebRequest request = WebRequest.Create(url);

          request.Method = "post";

     

          //初始化request参数

          string postData = "{ ID: \"1\", NAME: \"Jim\", CREATETIME: \"1988-09-11\" }";

     

          //设置参数的编码格式,解决中文乱码

          byte[] byteArray = Encoding.UTF8.GetBytes(postData);

     

          //设置request的MIME类型及内容长度

          request.ContentType = "application/json";

          request.ContentLength = byteArray.Length;

     

          //打开request字符流

          Stream dataStream = request.GetRequestStream();

          dataStream.Write(byteArray, 0, byteArray.Length);

          dataStream.Close();

     

          //定义response为前面的request响应

          WebResponse response = request.GetResponse();

     

          //获取相应的状态代码

          Console.WriteLine(((HttpWebResponse)response).StatusDescription);

     

          //定义response字符流

          dataStream = response.GetResponseStream();

          StreamReader reader = new StreamReader(dataStream);

          string responseFromServer = reader.ReadToEnd();//读取所有

          Console.WriteLine(responseFromServer);

        }

    当代码运行到request.GetResponse()这一句的时候,API里面进入断点

    尝试成功。

    三、put请求

    WebApi里面put请求一般用于对象的更新。它和用法和post请求基本相同。同样支持[FromBody],同样可以使用dynamic。

    1、基础类型参数

    ?

    1

    2

    3

    4

    5

    6

    7

    $.ajax({

        type: "put",

        url: "http://localhost:27221/api/Charging/Update",

        contentType: 'application/json',

        data: JSON.stringify({ ID: "1" }),

        success: function (data, status) {}

      });

    ?

    1

    2

    3

    4

    5

    [HttpPut]

       public bool Update(dynamic obj )

       {

         return true;

       }

    2、实体作为参数

    和post请求相同。

    3、数组作为参数

    和post请求相同。

    四、delete请求

    顾名思义,delete请求肯定是用于删除操作的。参数传递机制和post也是基本相同。下面简单给出一个例子,其他情况参考post请求。

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    var arr = [

        { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" },

        { ID: "2", NAME: "Lilei", CREATETIME: "1990-12-11" },

        { ID: "3", NAME: "Lucy", CREATETIME: "1986-01-10" }

      ];

      $.ajax({

        type: "delete",

        url: "http://localhost:27221/api/Charging/OptDelete",

        contentType: 'application/json',

        data: JSON.stringify(arr),

        success: function (data, status) {}

      });

    ?

    1

    2

    3

    4

    5

    [HttpDelete]

       public bool OptDelete(List<TB_CHARGING> lstChargin)

       {

         return true;

       }

     

    展开全文
  • 最近开发一个工厂自己用的工具!用来上传数据信息和返回处理结果!...思路很简单 数据返回之前看只有ajax 才可以 但是也只能返回json 所以就试了下能不能把list返回进去! using System; using System....

    最近开发一个工厂自己用的工具!用来上传数据信息和返回处理结果!因为用的是局域网所以这边对于网络的处理就不演示了!最好用的工具也就是Hbulider 也是最方便的!它里面已经给我们封装好了我们所需要的东西!废话不多说直接上思路!

    思路很简单 数据返回之前看只有ajax 才可以 但是也只能返回json 所以就试了下能不能把list也返回进去!

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    namespace MaterialsDetails.Models
    {
        public class ErrorLogs
        {
            public string Createtime { get; set; } //创建时间
            public string AssPeople { get; set; }  //需要帮助人
            public string StatusZT { get; set; } //状态
            public string ProbleMdes { get; set; } //问题描述
            public string Finds { get; set; } //异常提交人员信息
            public string AssPeop { get; set; } //需要协助人员信息
            public string StatusZTwo { get; set; } //状态二次查询
            public string StatusNumber { get; set; } //状态类型数字
            public string LookPeople { get; set; } //最新查看人
            public string LookTime { get; set; } //最新查看时间
            public string CLYJ { get; set; } //处理意见

        }
    }

    首先我们封装一个用于接受数据库的的对象类 用来接受我们list返回的数据信息!(如上代码)

    接下来展示访问数据类的代码 非常简单的访问数据库信息!

    using MaterialsDetails.Models;
    using System;
    using System.Collections.Generic;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http;

    namespace MaterialsDetails.Controllers
    {
        public class FeedBackViewController : ApiController
        {
            
            /// <summary>
            /// 查询数据库信息返回list数组
            /// </summary>
            /// <returns></returns>
            public List<ErrorLogs> GetAllUser()   //因为 WebApi 要想跟数据交互必须加上类似于Get 和Post 的开头 这里具体我就不解释了
            {
                List<ErrorLogs> list = new List<ErrorLogs>();  //接受返回的list集合数据!
                try
                {
                        string sql_lj = "Server=192.168.14.59;uid=sa;pwd=as;database=SupplyIsc";
                        SqlConnection connection = new SqlConnection(sql_lj);
                        connection.Open();
                        string sql = "select CreateTime,AssPeople,StatusZT,ProbleMdes,FindPeopleBM+'-'+FindPeople as Finds,AssPeopleBM+'-'+AssPeople as AssPeop,StatusZT,StatusNumber,isnull(ISNULL(EndPeople,CKPeople),FindPeople) as LookPeople,isnull(ISNULL(EndTime,CKTime),CreateTime) as LookTime,isnull(Handling,'无') as CLYJ from ErrorLogs order by StatusNumber,CreateTime desc";
                        SqlCommand comm = new SqlCommand(sql, connection);
                        SqlDataReader sdr = comm.ExecuteReader();
                        ErrorLogs er = new ErrorLogs();
                        while (sdr.Read())
                        {
                             er = new ErrorLogs { Createtime = sdr[0].ToString(), AssPeople = sdr[1].ToString(), StatusZT = sdr[2].ToString(), ProbleMdes = sdr[3].ToString(), Finds = sdr[4].ToString(), AssPeop = sdr[5].ToString(), StatusZTwo = sdr[6].ToString(), StatusNumber = sdr[7].ToString(), LookPeople = sdr[8].ToString(), LookTime = sdr[9].ToString(), CLYJ = sdr[10].ToString() }; //这里的下标根据index 获取所以我们只能从0开始 !之前因为从1拿数据导致后面数据不足造成报错
                            list.Add(er);  //这一句很重要不然数据写入会出现问题
                        }

                        if (!sdr.HasRows)
                        {
                            er = new ErrorLogs { LookTime = "无匹配记录" };
                            list.Add(er);  //这里判断下数据是否真的存在
                        } 

                        sdr.Close();
                }
                catch (Exception e)
                {

                }
                return list;
            }
        }
    }

     

    这个时候我们根据webapi的特性去访问路由信息就可以查到信息了

    接下来就是重点了!我们的Hbulider 如何去读取和获取他并绑定!

    首先先看我的Hbulider 界面的信息

    <!-- 主界面菜单同时移动 -->
            <!-- 侧滑导航根容器 -->
            <div class="mui-off-canvas-wrap mui-draggable">
             <!-- 主页面容器 -->
             <div class="mui-inner-wrap">
              <!-- 主页面标题 -->
             <header class="mui-bar mui-bar-nav">
             <h1 class="mui-title">异常信息展示</h1>
             </header>
                    <!-- 主页面内容容器 -->
            <div id="refreshContainer" class="mui-content mui-scroll-wrapper">         

            <!--外层最大DIV-->
                <div class="mui-scroll" >
                    
                    <!--以下为绑定反馈信息-->
                  <ul class="mui-table-view" id="assessPro">   
                   
                  </ul>
                
            </div>
        </div>

        
    </div>
    </div>

    红色为重要部分就是一个简单的 自带mui的窗体 写入一个 ul 控件用来展示信息

    接下来实现方法!

        <script src="js/mui.min.js"></script>
            <script type="text/javascript" charset="utf-8">
                
                
                mui.init({  

                   //这里的下拉刷新也特别简单 只要把我们需要刷新的容器的id和下面执行刷新方法的容器id一致就可以了
                    pullRefresh : {
                    container:"#refreshContainer",//下拉刷新容器标识,querySelector能定位的css选择器均可,比如:id、.class等
                    down : {
                      style:'circle',//必选,下拉刷新样式,目前支持原生5+ ‘circle’ 样式
                      color:'#2BD009', //可选,默认“#2BD009” 下拉刷新控件颜色
                      height:'50px',//可选,默认50px.下拉刷新控件的高度,
                      range:'100px', //可选 默认100px,控件可下拉拖拽的范围
                      offset:'0px', //可选 默认0px,下拉刷新控件的起始位置 
                      auto: true,//可选,默认false.首次加载自动上拉刷新一次   //因为首次进入手机界面不会去下拉所以我们设置默认自动下拉一次
                      callback :pullfreshfunctions //必选,刷新函数,根据具体业务来编写,比如通过ajax从服务器获取新数据;
                    }
                  },
                 });
         
         function pullfreshfunctions(){   //红色的是一个js的调用方法实现非常简单
             mui.ajax('http://192.168.14.59:65271/api/FeedBackView/GetAllUser',{
                             data:{ 
                             },
                             dataType:'json',//服务器返回json格式数据
                             type:'get',//HTTP请求类型
                             timeout:10000,//超时时间设置为10秒;
                             success:function(data){
                                 var listr = "";   //定义一个类型用来接受接下来拼接的数据!
                                 var data = data;   //拿到我们刚才Get方法的值

                                 for (i in data) {   //循环数据即可
                                     listr += "<li class='mui-table-view-cell mui-collapse'> "+
                                             "<a class='mui-navigate-right' href='#'><font id='StatusNumber"+data[i].StatusNumber+"'>"+data[i].Createtime+" "+data[i].AssPeople+" "+data[i].StatusZT+"</font></a>"+
                                             "<div class='mui-collapse-content'>"+
                                             "<p>异常问题:"+data[i].ProbleMdes+"</p>"+
                                             "<p>异常提交人员:"+data[i].Finds+"</p>"+
                                             "<p>请求协助人员:"+data[i].AssPeop+"</p>"+
                                             "<p>异常状态:"+data[i].StatusZTwo+"</p>"+
                                             "<p>最新更新时间:"+data[i].LookPeople+" "+data[i].LookTime+"</p>"+
                                             "<p>处理意见:"+data[i].CLYJ+"</p>"+
                                             "</div>"+
                                         "</li>"
                                         }  
                                         
                                        document.getElementById('assessPro').innerHTML=listr;  //将查询到的数据追加到li 里面               
                                        mui('#refreshContainer').pullRefresh().endPulldown();  //这里必须加上这个不然你的数据会一直刷新
                                        mui.toast("刷新成功"); //关闭刷新后友好提示

                            },
                             error:function(){
                                 alert("查询失败");  
                             }
                         });
                    } 
     </script>

    到这里我们的前后台算是写完了!手机界面展示为

    每次刷新将会从新从服务器读取数据出来并进行绑定实现了动态数据信息刷新!

    展开全文
  • 后台需要传个数组类型的数据,要么你用list类型接收,要么使用数组类型接收。怎么办呢? 直接在浏览器里面发get请求,把参数带在URL上,传到后台去。 对应的URL ...

    后台需要传个数组类型的数据,要么你用list类型接收,要么使用数组类型接收。怎么办呢?

    直接在浏览器里面发get请求,把参数带在URL上,传到后台去。


    对应的URL

    http://localhost:27001/test/test3?facilityType=None&facilityType=APM&facilityType=NPM&Tocken=cc0b88b8-a1a6-423e-b93c-378fd59a7f5d

    下面是使用浏览器看到的发get请求的时候,发的数据。


    然后,看后台怎么接收的。


    可以看到,传到后台了,而且,由框架自动转换成,对应的参数类型,不是简单的只能穿字符串类型。

    哦,我传的这个是枚举类型。下面是使用的枚举类型的类


    不知道传对象是什么情况。后面我再测试吧。

    注意,有个问题,要是参数传的不对,那就会404.

    如下。


    可以,看到我随意穿了个参数,进去,那个框架再自动转换成对应枚举类型的时候,失败啦。那么他就直接404啦。注意哦。



    展开全文
  • 1.返回数据如图: 数组里面嵌套对象 (用到部分的数据)2.遍历取值&lt;template&gt; &lt;div&gt; &lt;ul class="list"&gt; &lt;li class="child" v-for="...
  • vSphere API 编程模型(二) 本节主要包括以下内容: ■ 访问托管对象(Managed Object) ■ 访问 vSphere 服务器数据
  • WebAPI返回一个List

    千次阅读 2017-12-18 14:21:00
    前端: [AllowAnonymous] [HttpGet] public void Test20171218(string myPara) { var client = MyClient.Create(); var resp = client.GetAsync("MyUrl?myPara="+myP
  • 入门 ASP.NET Web API 2 (C#)

    万次阅读 2013-12-09 23:45:34
    HTTP 不只是为了生成 web 页面。它也是一个强大的建设公开服务和数据的 Api的平台。 HTTP 的特性:简单、 灵活和无处不在。... ASP.NET Web API 是用于生成基于.NET framework的web框架--- web Api。 在本
  • web开发API合集

    万次阅读 2018-03-08 11:09:58
    一、节点1.1 节点属性Node.nodeName //返回节点名称,只读Node.nodeType //返回节点类型的常数值,只读Node.nodeValue //返回Text或Comment节点的文本值,只读Node.textContent //返回当前节点和它的所有后代节点的...
  • Web API系列教程】1.1 — ASP.NET Web API入门

    万次阅读 多人点赞 2016-02-26 17:12:25
    前言HTTP不仅仅服务于web页面,同时也是构建暴露服务和数据的API的强大平台。...ASP.NET Web API是一个在.NET框架上构建web API的框架。在本教程中,你将使用ASP.NET Web API来创建一个返回产品列表的we
  • 在ajax的已不请求中,常常返回json对象。可以利用json.net给我们提供的api达到快速开发。 例子: using System; using System.Collections; using System.Configuration; using System.Data; using System....
  • 示例代码下载地址:http://download.csdn.net/detail/gangzhucoll/9844909 HTTP不仅仅是为了提供网页。它也是构建公开服务和数据的API的强大平台。HTTP简单,灵活,无所不在。... ASP.NET Web API
  • 经验分享-API接口响应格式规范定义

    千次阅读 2017-05-23 10:41:52
    1.关于接口响应数据格式参考[json格式],做到不使用的属性不返回 基础响应格式【其他格式在此格式上进行扩展】 {  "code":100,  "msg":"ok", } 对象格式【对象数据存在】【对象数据不存在,使用基础响应格式】 e
  • Java集合容器面试题(2020最新版)

    万次阅读 多人点赞 2020-05-06 14:11:36
    List,Set,Map三者的区别?List、Set、Map 是否继承自 Collection 接口?List、Map、Set 三个接口存取元素时,各有什么特点?集合框架底层数据结构哪些集合类是线程安全的?Java集合的快速失败机制 “fail-fast”?...
  • PHP学习线路图

    万次阅读 多人点赞 2018-12-19 12:02:13
    PHP学习线路图 PHP教程 PHP教程 ...PHP数组 ...PHP Web概念 PHP的GET和POST方法 PHP 文件包含 PHP文件和I _ O PHP函数 PHP Cookies PHP会话 PHP发送电子邮件 PHP文件上传 P...
  • 如何用sessionStorage保存对象和数组

    千次阅读 2018-10-29 16:45:22
    sessionStorage、localStorage详解 webstorage是本地存储,存储在客户端,包括localStorage和sessionStorage。在JavaScript语言中可通过 window.sessionStorage 或 sessionStorage ...
  • 终于知道怎么在c#后台发post请求了

    万次阅读 2018-06-20 16:32:05
    C#进阶系列——WebApi 接口参数不再困惑:传参详解阅读目录一、get请求1、基础类型参数2、实体作为参数3、数组作为参数4、“怪异”的get请求二、post请求1、基础类型参数2、实体作为参数3、数组作为参数4、后台发送...
  • 描述: 此示例遍历所有的地图服务中的图层,并添加到每一个复选框到列表中,可以切换和关闭的图层。参考示例Toggle layer visibility.   ...这将生成图层列表。保存在列表中的每一层的默认可见性。...
  • 昨天花了一天的时间学习了一下highcharts,基本的内容差不多都看了一遍,然后试着写了一个完整的demo,期间可谓百转千回,费了不少功夫,最终还是实现了我所想要的效果图,接下来我将如何实现统计图的过程给大家说...
  • 前端遍历有多种情况,除最常用的for循环外,还有for in、for of 等等,有针对数组的map遍历、forEach遍历,有针对对象的Object.keys、object.values等等。 1、for循环,for in,for of的区别在哪里? 先说说数组...
1 2 3 4 5 ... 20
收藏数 41,211
精华内容 16,484
关键字:

webapi 数组 返回list