шаблоны jquery с вызовом JSON для шаблона и данных - PullRequest
0 голосов
/ 24 июня 2011

У меня возникла интересная проблема с шаблонами jQuery. Я хочу иметь возможность получить динамический шаблон через JSON (который у меня работает), а затем данные, соответствующие этому шаблону, через 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, на 100% идентичны «жестко закодированному» массиву (arr). Я использовал Beyond Compare для результатов, и они на 100% идентичны.

Для полноты: вот код, который возвращает данные JSon:

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 является просто переопределением .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();
}

Есть ли что-то, чего мне не хватает, когда результат возвращается из запроса JSon?

1 Ответ

0 голосов
/ 24 июня 2011

Разобрался с проблемой с помощью коллеги. Как оказалось, шаблон не будет принимать строковое значение как объект, поэтому вам нужно проанализировать его как объект JSON:

var arr = dataz.Result.toString();

var obj = $.parseJSON(arr);

Однако следует отметить, что способ, которым я это сделал, был немного неправильным, и метод $.parseJSON вызвал бы исключение из-за "уродливого" json.

Что у меня есть выше:

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

не сработает, должно быть:

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