DotNet的Chnage格式返回

时间:2018-10-07 14:56:22

标签: asp.net

我使用dotNet创建了Web API。它有效,但是我有一个小问题。 这是我的控制器

 WaybillDataAccessLayer objway = new WaybillDataAccessLayer();
 public IEnumerable<Waybill> Get(string id_wb)
    {

        List<Waybill> lstWaybill = new List<Waybill>();
        lstWaybill = objway.GetWaybill(id_wb).ToList();
        return lstWaybill;
    }

和我的模型(WaybillDataAccessLayer)

public IEnumerable<Waybill> GetWaybill(String id_wb)
    {
        List<Waybill> lswaybill = new List<Waybill>();

        using (SqlConnection con = new SqlConnection(connectionString))
        {
            SqlCommand cmd = new SqlCommand("spGetWaybill", con);    //Stored procedure on database
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@waybill", id_wb);
            con.Open();
            SqlDataReader rdr = cmd.ExecuteReader();

            while (rdr.Read()) //foreach   
            {
                Waybill wb = new Waybill();

                wb.waybill = rdr["waybill"].ToString();
                wb.deskripsi = rdr["deskripsi"].ToString();
                wb.tanggal = rdr["tanggal"].ToString();
                wb.pengirim = rdr["pengirim"].ToString();
                wb.lokasi = rdr["lokasi"].ToString();
                wb.penerima = rdr["penerima"].ToString();

                lswaybill.Add(wb);
            }
            con.Close();
        }
        return lswaybill;
    }

当我运行此API时,输出将如下所示

  

[       {           “ waybill”:“ 00000093”,           “ deskripsi”:“备件”,           “ tanggal”:“ 19990727”,           “ pengirim”:“ JIEP”,           “ lokasi”:“ HO”,           “ penerima”:“ JKHO”       }   ]

我的问题是

  1. 如何删除[]?

  2. 如何添加其他信息,例如

{

“状态”:“成功”,

“数据” {}

}

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您将返回WayBill对象的列表。如果您不希望结果JSON成为数组,则只需返回单个WayBill,而不是List。而且,如果您想将其包装在更多数据中,请创建一个表示该信息的类型,并填充其中的一个实例,然后将其返回。

由于您是按ID检索这些对象的,因此我假设任何给定的ID应该只有一个运单。因此,您可以简化数据访问层。

public Waybill GetWaybill(String id_wb)
{
    using (SqlConnection con = new SqlConnection(connectionString))
    using (SqlCommand cmd = new SqlCommand("spGetWaybill", con))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@waybill", id_wb);
        con.Open();
        SqlDataReader rdr = cmd.ExecuteReader();
        rdr.Read();
        Waybill wb = new Waybill();
        wb.waybill = rdr["waybill"].ToString();
        wb.deskripsi = rdr["deskripsi"].ToString();
        wb.tanggal = rdr["tanggal"].ToString();
        wb.pengirim = rdr["pengirim"].ToString();
        wb.lokasi = rdr["lokasi"].ToString();
        wb.penerima = rdr["penerima"].ToString();
        return wb;
    }
}

并添加类型以包装您的回复:

class GetWayBillResponse()
{
    public string Status { get; set;}

    public WayBill WayBill { get; set; }
}

请注意,如果您看到对象,则在此处添加状态并没有真正帮助,可以认为它是成功的。同样,API会以HTTP 200 OK状态代码响应。因此,这确实是多余的。

现在您的控制器将变为:

WaybillDataAccessLayer objway = new WaybillDataAccessLayer();

public GetWayBillResponse Get(string id_wb)
{
    GetWayBillResponse response = new GetWayBillResponse();
    response.Status = "Success";
    response.WayBill = objway.GetWaybill(id_wb);
    return response;
}

请注意,您可以进一步简化数据访问。您正在将结果列手动分配给WayBill对象。这是重复的和无聊的。如果您使用诸如Dapper之类的对象关系映射器,则可以删除很多样板代码。

这是使用Dapper的样子:

public Waybill GetWaybill(String id_wb)
{
    using (SqlConnection con = new SqlConnection(connectionString))
    {
        return con.QuerySingle<WayBill>("spGetWaybill", new { waybill = id_web }, commandType: CommandType.StoredProcedure);
    }
}