Загрузка панели дерева EXT JS с контроллера C # MVC - PullRequest
1 голос
/ 24 марта 2011

Мне повезло, что я заполнил поля со списком EXT JS и поля со списком с помощью C # MVC 2 и 3, но сейчас я пытаюсь заняться загрузкой панели дерева EXT JS.Пока что я не могу загрузить дерево из всего, что я положил на контроллер.

Сейчас я экспериментирую с простым возвратом статических данных из контроллера, например:

 public  ActionResult TreeFill()
        {
            var stuff = "[{ text: Type1, id: 100, leaf: false, cls: 'folder', children: [{ text: 'Client 1', id: 1, leaf: true, cls: 'file' },{ text: 'Client 2', id: 2, leaf: true, cls: 'file' },{ text: 'Client 3', id: 3, leaf: true, cls: 'file' },{ text: 'Client 4', id: 4, leaf: true, cls: 'file' }]}";

            return Json(new {stuff},JsonRequestBehavior.AllowGet);
        }

... и у меня, очевидно, есть проблемы с этим, но это было отправной точкой (в том смысле, что то, что не работает, часто приводит к тому, что будет работать).Теперь я понимаю, что у меня даже нет отличной отправной точки для загрузки дерева из контроллера.Я предполагаю, что мне нужно будет вернуть необработанные данные из базы данных и отформатировать их через цикл в формате, который может использовать тип «Json».Я не нахожу много онлайн по этой теме, поэтому любое руководство, которое кто-либо может дать, будет высоко ценится.Если у меня будет какой-либо успех, я буду следить здесь.Спасибо!

Ответы [ 3 ]

0 голосов
/ 25 марта 2011

Это метод грубой силы (и он еще не завершен; ему нужно больше абстракций, плюс мне не нравятся 2 оператора LINQ - ему нужно только 1), но он загружает данные дерева с допустимым Json. Пожалуйста, поделитесь любыми красными флагами, которые могут появиться с помощью этого метода, или если я иду по странному пути.

public string TreeLoader()
    {
        var clis = TreeLoad();

        var parent = "[{ \"text\": \"Pharm\", \"id\": 100, \"leaf\": false, \"cls\": \"folder\", \"children\": [";

        for (int i = 1; i < clis.Count(); i++)
        {
            parent += "{\"text\": \"" + (from c in clis where c.id == i select c.text).SingleOrDefault() + "\"" +
                      ", \"id\":" + (from c in clis where c.id == i select c.id).SingleOrDefault() +
                      ", \"leaf\": true, \"cls\": \"file\"}";

            if (i < clis.Count() - 1)
            {
                parent += ", ";
            }
        }

        parent += "]}]";

        return parent;
    }

Контроллер содержит только это:

public ActionResult TreeSampleFill()
        {
            var result = repo.TreeLoader();

            return Content(result);
        }
0 голосов
/ 28 марта 2011

Следующий код в некоторой степени улучшает приведенный выше код и, хотя все еще груб, он прекрасно отображает дерево:

 public List<TreeNode> TreeTest()
    {
        var results1 = (from c in _Context.v_EntityTrees
                    where c.OU_TYPE_CD == "Type1"
                    orderby c.text
                    select c).ToList();

        var results2 = (from d in _Context.v_EntityTrees
                   where d.OU_TYPE_CD == "Type2"
                   orderby d.text
                   select d).ToList();

        TreeNode node = new TreeNode();
        List<TreeNode> nodelist = new List<TreeNode>();
        nodelist.Add(new TreeNode { text = "Parent1", cls = "folder", leaf = false, id = 1000, children = results1 });
        nodelist.Add(new TreeNode { text = "Parent2", cls = "folder", leaf = false, id = 2000, children = results2 });

        return nodelist;
    }

Что-то еще, что я также обнаружил: дерево EXT JS может вести себя странно, если какой-либо изузлы имеют идентичные идентификаторы, особенно , если родительский и дочерний элементы имеют совпадающие идентификаторы.Когда я впервые отображал это дерево, первый родитель не открывался после открытия второго родителя.Оказывается, его родительский идентификатор совпадает с одним из его дочерних идентификаторов.

0 голосов
/ 24 марта 2011

Вот некоторый JavaScript, который я использовал для загрузки Ext Tree - я знаю, что это не на 100% то, что вы делаете, но, надеюсь, это поможет:

tree.setRootNode(new Ext.tree.AsyncTreeNode({ id: 0, text: "Subjects", expandable: false, expanded: true }));
loadTree(function(d) {
    tree.setRootNode(new Ext.tree.AsyncTreeNode({ id: 0, text: "Subjects", children: d, expandable: false, expanded: true }));
});

function loadTree(callback) {
    runAjax("MyServiceBlahBlahBlah.asmx/Foo", "{ItemType:" + ItemType + "}",
        function(data) {
            cleanTree(data.d);
            callback(data.d);
        });
}

//hmmm - cleanTree isn't a good name for this function, not sure what I was thinking when I named it...
function cleanTree(data, expand) {
    for (var i = 0; i < data.length; i++) {
        data[i].checked = false;
        if (expand) data[i].expanded = true;

        cleanTree(data[i].children, expand);
    }
}

А вот немного C #, который я использую для создания JSON. Сорыр, чтобы бросить в тебя кухонную раковину - опять же, надеюсь, кое-что из этого тебе поможет:)

Кстати - я использовал несколько различных наборов веб-виджетов, и EXT - мой самый любимый - такой хороший выбор!

    public static object GetSubjectHierarchyJSON(Func<vwHierarchicalSubject, bool> InitialPredicate, HierarchicalSubjectDAO DAO, int ItemType) {
        List<LINQLayer.vwHierarchicalSubject> TempSource = DAO.GetAll(DAO.UserID, ItemType).
            OrderBy(V => V.ParentSubjectName).ThenBy(V => V.LevelNumber).ThenBy(V => V.SubjectName).ToList();

        var result = new List<object>();

        foreach (vwHierarchicalSubject V in TempSource.Where(InitialPredicate).OrderBy(v => v.SubjectName))
            result.Add(BuildJSON(V, TempSource));

        return result;
    }

    private static object BuildJSON(vwHierarchicalSubject V, List<vwHierarchicalSubject> TempSource) {
        IEnumerable<vwHierarchicalSubject> Children =
            TempSource.Where(x => x.ParentID.HasValue && x.ParentID.Value == V.id).OrderBy(v => v.SubjectName);

        int id = V.id;
        string subText = V.SubjectName.Replace("&", "&amp;");

        if (Children.Count() == 0)
            return new { id = V.id, text = subText, children = new List<object>(), expanded = true };
        else {
            var result = new { id = V.id, text = subText, children = new List<object>() };
            foreach (vwHierarchicalSubject vElement in Children)
                result.children.Add(BuildJSON(vElement, TempSource));
            return result;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...