0

だから、私はこのオブジェクトを使用しています

public class OrdenCompra
    {
        public String Proveedor { get; set; }
        public String EmitidaPor { get; set; }
        public String NumOrden { get; set; }
        public String TipoPago { get; set; }
        public String Descuento { get; set; }
        public String Recargo { get; set; }
        public String Observacion { get; set; }
        public List<DetalleOrden> Detalle { get; set; }

        public ObjectId Id { get; set; }
        public OrdenCompra() { this.Id = ObjectId.GenerateNewId(); }
        public OrdenCompra(ObjectId id) { this.Id = id; }
    }

通常のオブジェクトを使用でき、アプリに問題はありませんが、すべてのデータをレポートなどの html ファイルにエクスポートする必要があります。

html マークアップを作成し、jQuery を使用して json ファイル内のすべてのデータを html に配置します。

そして、私はそれを通常の方法で呼び出すだけです

public String JsongetOrdenCompra(String orden)
        {
            try
            {
                return this._Collection.FindOneAs<OrdenCompra>(Query.EQ("NumOrden", orden)).ToJson();
            }
            catch (Exception e)
            {
                throw new Exception("Error al obtener Orden de Compra. \n"+e.Message);
            }
        }

問題は「_id」キーなので、jsonは次のようになります

{"キー":"値", "bla":"bla", "_id" : ObjectId("516d3f86a3e2c814ac7ca180")}

だから解析できない…

SetFields(Exclude("_id")) の方法があることは知っていますが、FindOneAsでは使用できません...

ありがとう !

4

2 に答える 2

1

MongoDBToJson拡張メソッドの動作は少し奇妙です。構成することはできますが、出力の処理が難しくなる傾向があります。ServiceStack.Text次のように、またはJavaScriptSerializerを Json シリアライザーとして使用することをお勧めします。

public string JsongetOrdenCompra(String orden)
{
    try
    {
        var data = this._Collection.FindOneAs<OrdenCompra>(Query.EQ("NumOrden", orden));
        var s = new System.Web.Script.Serialization.JavaScriptSerializer();
        var result = s.Serialize(data);
        return result;
        // Alternatively, ServiceStack.Text.JsSerializer or 
        // extension methods like ASP.NET MVC's Json()
    }
    catch (Exception e)
    {
        throw new Exception("Error al obtener Orden de Compra. \n"+e.Message);
    }
}

すべてのデータを一般に公開しており、一般とデータベースの間に追加レベルの検証と検証がないため、これはすべてベスト プラクティスではありません。

より良いアプローチは、通常、データ転送オブジェクト (DTO)を作成し、たとえば を使用してデータをマップするAutoMapperことです。

public class OrdenDTO 
{
    public String Proveedor { get; set; }
    public String EmitidaPor { get; set; }
}

public class OrdenReadDTO : OrdenDTO
{
    public ObjectId Id { get; set; }
}

{
...
  var data = this._Collection.FindOneAs<OrdenCompra>(Query.EQ("NumOrden", orden));
  var dto = AutoMapper.Mapper.DynamicMap<OrdenReadDTO>(dto);
  var s = new System.Web.Script.Serialization.JavaScriptSerializer();
  var string = s.Serialize(data);
  return string;
}

OrdenDTOには、サーバーに送信できるすべての情報と、サーバーOrdenReadDTOから読み取ることができるすべてのデータが含まれるという考え方です。通常、ID は読み取り専用です。

ASP.NET MVC または同様のフレームワークを使用している場合は、通常、次のように実際のドメイン オブジェクトを操作できるメソッドがあります。

public ActionResult JsongetOrdenCompra(String orden)
{
    // Assuming ASP.NET MVC
    try
    {
        var data = this._Collection.FindOneAs<OrdenCompra>(Query.EQ("NumOrden", orden));
        var dto = AutoMapper.Mapper.DynamicMap<OrdenReadDTO>(dto);
        return Json(dto);
    }
    catch (Exception e)
    {
        throw new Exception("Error al obtener Orden de Compra. \n"+e.Message);
    }
}
于 2013-04-16T13:17:32.210 に答える