1

mvc ajax json post applicaiton を作成すると、json 動的オブジェクトをエンティティに変換する際に問題が発生します。

私のアプリでは、ムービーはビジネス エンティティであり、json オブジェクトにはムービー エンティティよりも行ステータス プロパティがあります。json データが mvc サーバー側にポストされると、動的オブジェクトに変換できます。この段階ではすべてが OK です。ただし、各行ステータスにいくつかのロジックを処理した後、動的オブジェクトをムービー ビジネス エンティティに変換し、データベース トランザクション ロジックを開始する必要があります。しかし、オブジェクトをキャストするために別の方法を試しても問題があります。

誰かが同じキャスト方法を使用しましたか? あなたのアドバイスや返信に感謝します。

public class movie
{
    public int id
    {
        get;
        set;
    }

    public string title
    {
        get;
        set;
    }
}



    /// <summary>
    /// Convert Json Object to Entity
    /// </summary>
    /// <param name="id">ajax post value
    /// format: {"id": "{\"id\": 1, \"title\": \"sharlock\", \"RowStatus\": \"deleted\"}"}
    /// </param>
    [AllowAnonymous]
    [HttpPost]
    public void DoJsonSimple(string id)
    {
        string title;
        var entity = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(id);

        //*** entity is dynamic object
        //*** entity.id, entity.title and entity.RowStauts can be accessed.
        int first = entity.id;
        var status = entity.RowStatus;
        if (status == "deleted")
        {
            //*** m1 is null
            //*** m1.title can not be accessed
            movie m1 = entity as movie;
            title = m1.title;

            //*** m2 is an empty object
            //*** m2.id is 0, m2.title is null
            var m2 = AutoMapperHelper<dynamic, movie>.AutoConvertDynamic(entity);
            title = m2.title;

            //*** Exception: Object must implement IConvertible. 
            var m3 = EmitMapper.EMConvert.ChangeTypeGeneric<dynamic, movie>(entity);
            title = m3.title;
        }
    }
4

1 に答える 1

2

行用に別のクラスを作成するだけです。

public class Request
{
    [JsonProperty("id")]
    public string Json { get; set; }
}

public class Movie
{
    [JsonProperty("id")]
    public int Id { get; set; }

    [JsonProperty("title")]
    public string Title { get; set; }
}

// either this for variant 1...
public class Row
{
    public string RowStatus { get; set; }
}

// or that for variant 2...
public class MovieRow : Movie
{
    public string RowStatus { get; set; }
}

[AllowAnonymous]
[HttpPost]
public void DoJsonSimple_Variant1(string id)
{
    var json = JsonConvert.DeserializeObject<Request>(id).Json;
    var entity = JsonConvert.DeserializeObject<MovieRow>(json);
    var row = JsonConvert.DeserializeObject<Row>(json);

    switch (row.RowStatus)
    {
        case "deleted":
            // delete entity
            break;

        // ...
    }

    // ...
}

[AllowAnonymous]
[HttpPost]
public void DoJsonSimple_Variant2(string id)
{
    var json = JsonConvert.DeserializeObject<Request>(id).Json;
    var row = JsonConvert.DeserializeObject<MovieRow>(json);
    var entity = (Movie)row;

    switch (row.RowStatus)
    {
        case "deleted":
            // delete entity
            break;

        // ...
    }

    // ...
}
于 2013-03-29T02:34:10.267 に答える