4 Stimmen

ASP.NET MVC 3 Controller .Json-Methode Serialisierung sieht nicht auf DataMember Name Attribut

In meiner Klasse habe ich:

[DataMember(Name = "jsonMemberName", EmitDefaultValue = false, 
    IsRequired = false)]
public List<string> Member { get; set; }

Nach der Übergabe des Objekts durch Controller's Json(obj), die System.Web.Mvc.JsonResult: Ich habe serialisierte Json: {Member:...} aber nicht {jsonMemberName:...}, so dass es nicht auf DataMember(Name = "jsonMemberName") aussehen.

Wenn ich Serialisierung von System.Runtime.Serialization.Json everithing's funktioniert gut wie erwartet.

Was kann falsch sein?

12voto

Darin Dimitrov Punkte 990883

En JsonResult Aktion, die Sie von der Controller-Aktion zurückgeben (mit return Json(...) ) stützt sich intern auf die JavaScriptSerializer Klasse. Diese Klasse berücksichtigt keine DataMember Attribute für Ihr Modell.

Sie könnten ein benutzerdefiniertes ActionResult schreiben, das den Serializer in der System.Runtime.Serialization.Json Namensraum.

Zum Beispiel:

public class MyJsonResult : JsonResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        if (!string.IsNullOrEmpty(ContentType))
        {
            response.ContentType = ContentType;
        }
        else
        {
            response.ContentType = "application/json";
        }
        if (ContentEncoding != null)
        {
            response.ContentEncoding = this.ContentEncoding;
        }
        if (Data != null)
        {
            var serializer = new DataContractJsonSerializer(Data.GetType());
            serializer.WriteObject(response.OutputStream, Data);
        }
    }
}

und dann in Ihrer Controller-Aktion:

public ActionResult Foo()
{
    var model = ...
    return new MyJsonResult { Data = model };
}

2voto

adamjford Punkte 7368

System.Web.Mvc.JsonResult Verwendung der alten JavaScriptSerializer Klasse, die nichts über die DataAnnotiations-Assembly weiß. Sie müssen die DataContractJsonSerializer stattdessen.

Sie können dies stattdessen auf JsonResult verwenden, wenn Sie dies wünschen:

public class DataContractJsonResult : JsonResult
{
    public DataContractJsonResult(object data)
    {
        Data = data;
    }

    public DataContractJsonResult()
    {
    }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        if (JsonRequestBehavior == JsonRequestBehavior.DenyGet &&
            String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
        {
            throw new InvalidOperationException("This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet.");
        }

        HttpResponseBase response = context.HttpContext.Response;

        if (!string.IsNullOrEmpty(ContentType))
        {
            response.ContentType = ContentType;
        }
        else
        {
            response.ContentType = "application/json";
        }
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data != null)
        {
            var serializer = new DataContractJsonSerializer(Data.GetType());
            var ms = new MemoryStream();
            serializer.WriteObject(ms, Data);
            string json = Encoding.UTF8.GetString(ms.ToArray());
            response.Write(json);
        }
    }
}

(Ich habe auf den ASP.NET MVC-Quellcode verwiesen, um dies zu erstellen. Ich bin mir nicht sicher, ob ich ihn in irgendeiner Form erwähnen muss. Nun, mehr als diese Seite bereits ist, das ist. :))

Sie können dies auch zu einer Basisklasse hinzufügen, von der Ihre Controller erben:

protected JsonResult DataContractJson(object data)
{
    return new DataContractJsonResult(data);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X