2011-02-17 8 views
2

Je réalise pour la première fois Json.NET pour mon site ASP.NET MVC2.asp.net mvc json.net réponse

Mon code d'origine ressemblait à ceci:

[HttpPost] 
public ActionResult FindMe(string searchFirstName, string searchLastName) 
{ 
    this.searchFirstName = searchFirstName; 
    this.searchLastName = searchLastName; 
    IEnumerable<HomePageUser> results = doSearch(); 
    bool success = (results.Count() == 0) ? false : true; 

    return Json(new 
    { 
     success = success, 
     results = results 
    }); 
} 

Les résultats ont été problématique en raison du fait que l'un des éléments dans le jeu de résultats est un Enum et je veux vraiment la valeur du texte, pas un numérique . En outre, le format de date est un problème.

Alors, je puis trouvé Json.NET et changé mon code à ceci:

[HttpPost] 
public JsonNetResult FindMe(string searchFirstName, string searchLastName) 
{ 
    this.searchFirstName = searchFirstName; 
    this.searchLastName = searchLastName; 
    IEnumerable<HomePageUser> results = doSearch(); 
    bool success = (results.Count() == 0) ? false : true; 

    JsonNetResult jsonNetResult = new JsonNetResult(); 
    jsonNetResult.SerializerSettings.Converters.Add(new IsoDateTimeConverter()); 
    jsonNetResult.Data = results;// how to add success true/false info? 

    return jsonNetResult; 
} 

Cela corrige les deux questions ci-dessus, mais maintenant je me demande comment faire ce transparente avec mon code existant javascript qui s'attendait JSON qui ressemblait à:

{ 
    "success":true, 
    "results":[{ 
     "UserId":545, 
     "FirstName":"Scott", 
     "LastName":"Roberson"}] 
} 

Cela m'a permis de premier test pour response.success avant de passer à écrire la réponse, par rapport à se déplacer dans la section pour gérer les erreurs. Donc, ma question est comment puis-je ajouter un nœud json de succès de haut niveau pour vivre à côté du nœud de résultats?

Merci.

MISE À JOUR:

Comme est souvent le cas, l'acte d'écrire une question a suscité une idée dans un de ces Doh! des moments.

si j'ajoute:

var returnPackage = new { success = success, results = results}; 

puis l'ajouter à la jsonNetResult.Data comme ceci:

jsonNetResult.Data = returnPackage; 

Il fonctionne parfaitement.

Merci quand même.

Code final:

[HttpPost] 
public JsonNetResult FindMe(string searchFirstName, string searchLastName) 
{ 
    this.searchFirstName = searchFirstName; 
    this.searchLastName = searchLastName; 
    IEnumerable<HomePageUser> results = doSearch(); 
    bool success = (results.Count() == 0) ? false : true; 

    var returnPackage = new { success = success, results = results}; 

    JsonNetResult jsonNetResult = new JsonNetResult(); 
    jsonNetResult.SerializerSettings.Converters.Add(new IsoDateTimeConverter()); 
    jsonNetResult.Data = returnPackage; 

    return jsonNetResult; 
} 

Répondre

2

Voici ce que je fais dans mes applications MVC/Ajaxy. Définir une nouvelle classe:

public class JsonResultData 
{ 
    private bool _success = true; 
    public bool Success 
    { 
     get { return _success; } 
     set { _success = value; } 
    } 

    public object Value { get; set; } 
    public List<string> Errors { get; set; } 

    public JsonResultData() 
    { 
     this.Errors = new List<string>(); 
    } 
} 

Ensuite, configurez votre valeur de données de retour à:

jsonNetResult.Data = new JsonResultData { Value = results }; 

JsonResultData.Success propriété est ce que vous voulez tester dans la réponse JSON premier. Il est par défaut vrai, mais si quelque chose ne va pas dans votre méthode côté serveur, vous le définissez sur false et ajoutez votre message d'erreur, comme ceci:

catch (Exception ex) 
    { 
     List<string> errors = new List<string>(); 
     errors.Add(ex.ToString()); 
     jsonNetResult.Data = new JsonResultData { Success = false, Errors = errors }; 
    }