2011-06-24 13 views
0

jQueryテンプレートで興味深い問題が発生しています。私はJSON(私が働いている)を介して動的なテンプレートを取得したいし、私の問題がある場所であるJSON経由でそのテンプレートに一致するデータを取得したいと考えています。ここでjqueryテンプレートとデータのJSON呼び出しテンプレート

は、私は、テンプレートのもののために持っているものです。

$.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 { 
    } 
}); 

テンプレート自体は戻って来て、成功しています。ハードコーディングされた配列(arr)のコメントを外し、返された値の代わりに使用すると、期待どおりにテーブルが正確に表示されます。私はJSONしかし、データを返さ使用する場合、私はこのようになります何かを得る(私は左側の空白があるユーザ名を、削除):

jQueryTemplateResult

JSONリクエストから戻ってきたデータ"ハードコーディングされた"配列(arr)と100%同一です。私は結果と比較してBeyond Compareを使用しました。彼らは100%同一です。徹底のために

は:.ToString()のちょうどオーバーライド

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されています:何かが欠落しているイム

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(); 
} 

ありここでJSONデータを返すコードです結果はJSonリクエストから戻ってきますか?

答えて

0

同僚の助けを借りて問題を見つけました。 結局のところ、テンプレートを使用すると、JSONオブジェクトとしてそれを解析する必要があるので、オブジェクトとして文字列値を取りません。

var arr = dataz.Result.toString(); 

var obj = $.parseJSON(arr); 

をしかし、注意すべき一つのこと、私はこれだったの道をやや不正確で、$.parseJSONメソッドは "不正な" jsonのために例外をスローします。

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

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

が動作しません、それはする必要があります:私は上記の持っている何

関連する問題