2011-06-24 2 views
0

Je rencontre un problème intéressant avec les modèles jQuery. Je veux être en mesure d'obtenir un modèle dynamique via JSON (que j'ai travaillé) et ensuite des données pour correspondre à ce modèle via JSON, qui est où mon problème réside.Modèles jquery avec un appel JSON pour le modèle et les données

Voici ce que j'ai pour les trucs de modèle:

$.getJSON('@Url.Action("GenerateAdminTemplate", "Home", new { area = "" })', function (data) { 
    if (data.Success) { 
     adminListTemplate = data.Result; 
     $("#adminListHeader").html(data.Header); 
     $.getJSON('@Url.Action("GenerateAdminSheet", "Home", new {area = ""})', function (dataz) { 
      if (dataz.Success) { 
       $("#templateListing").text(data.Result); 
       $("#markupBeforeTemplateListing").text(dataz.Result); 
       var myTemplate = $.template(null, data.Result); 

       //var arr = [ 
       // { Name: "User1", Administrator: "yes", Supervisor: "no", User: "yes" }, 
       // { Name: "User2", Administrator: "yes", Supervisor: "no", User: "no" } 
       //]; 

       var arr = dataz.Result; 

       $.tmpl(myTemplate, arr).appendTo("#adminListBody"); 
      } else { 

      } 
     }); 
    } else { 
    } 
}); 

Le modèle lui-même revient et est couronnée de succès. Lorsque je décommente le tableau codé en dur (arr) et l'utilise à la place de la valeur renvoyée, la table apparaît EXACTEMENT comme je le souhaite. Lorsque j'utilise JSON données renvoyées cependant, je reçois quelque chose qui ressemble à ceci (je l'ai enlevé le nom d'utilisateur, qui est l'espace vide sur la gauche):

jQueryTemplateResult

Les données qui revient de la demande JSON est 100% identique au tableau "hardcoded" (arr). J'ai utilisé Beyond Compare sur les résultats et ils sont identiques à 100%.

Pour rigueur: Voici le code qui renvoie le JSon Data:

public JsonResult GenerateAdminSheet() 
{ 
    bool success = false; 
    String errorMessage = String.Empty; 
    StringBuilder result = new StringBuilder(); 


    try 
    { 
     List<String> listOfUsersAndRoles = new List<String>(); 

     using (DataUtilityEntities data = new DataUtilityEntities(ConfigurationManager.ConnectionStrings["DataUtilityConnection"].ConnectionString)) 
     { 
      List<User> users = data.Users.ToList(); 

      foreach (User u in users) 
      { 
       List<Role> rolesUserBelongsTo = data.UserInRoles.Where(o => o.UserId == u.UserId).Select(p => p.Role).ToList(); 

       CustomDictionary allRoles = new CustomDictionary(); 

       //add the username as the first entry in the dictionary 
       allRoles.Add("Name", u.Username); 

       List<Role> allRolesList = data.Roles.ToList(); 

       foreach (Role r in allRolesList) 
       { 
        allRoles.Add(String.Format("{0}", r.Name), rolesUserBelongsTo.Exists(p => p.Name == r.Name) ? "yes" : "no"); 
       } 

       listOfUsersAndRoles.Add(allRoles.ToString()); 
      } 

     } 

     //We have the list of the objects to pass back, now we just need to format them so they will work properly 
     result.Append("["); 
     foreach (String item in listOfUsersAndRoles) 
     { 
      result.Append(item); 
      if (listOfUsersAndRoles.Last() != item) 
       result.Append(", "); 
     } 
     result.Append("]"); 

     success = true; 
    } 
    catch (Exception e) 
    { 
     success = false; 
     errorMessage = String.Format("@There was an error: {0}{1}", e.Message, e.InnerException == null ? String.Empty : String.Format("@({0})", e.InnerException.Message)); 
    } 

    return Json(new { Success = success, ErrorMessage = errorMessage, Result = result.ToString() }, JsonRequestBehavior.AllowGet); 

CustomDictionary est juste un remplacement de la .ToString():

public override string ToString() 
{ 
    StringBuilder result = new StringBuilder(); 
    result.Append("{ "); 

    foreach (var pair in this) 
    { 
     result.Append(String.Format("{0}: \"{1}\"{2}", pair.Key, pair.Value, this.Last().Key == pair.Key ? String.Empty : ", ")); 
    } 

    result.Append(" }"); 
    return result.ToString(); 
} 

Y at-il quelque chose Im manquant lorsque le résultat revient de la demande JSon?

Répondre

0

Compris le problème avec l'aide d'un collègue. Comme il se trouve, le modèle ne sera pas prendre une valeur de chaîne comme un objet, vous devez donc analyser comme un objet JSON:

var arr = dataz.Result.toString(); 

var obj = $.parseJSON(arr); 

Cependant, une chose à noter, la façon dont je l'ai fait était légèrement incorrect et la méthode $.parseJSON lèverait une exception due à "mal formé" json.

Ce que j'ai ci-dessus:

[{Name: "user", Administrator: "yes" ... }, {Name: "user2", ...}] 

ne fonctionnera pas, il doit être:

[{"Name": "user", "Administrator": "yes" ...}, {"Name": "user2", ...}] 
Questions connexes