ASP.NET MVC 3 Treeview

Мне нужно отобразить Treeview в моем приложении MVC3. Будет создана иерархическая таблица (Folders) для самостоятельной привязки и другая связанная с ней таблица (Documents.) (Таким образом, папки могут иметь N-subFolders, а в любой папке/подпапке может быть много документов.)

Я изучил использование сторонних поставщиков, таких как Telerik, DJME и MVC Controls Toolkit. В то время как все приятные пакеты, я не понимаю о лицензиях, и поскольку я новичок в MVC (и вообще в программировании), я нахожу их документацию, не требующую правильного отображения работы.

Я также посмотрел блоги с высокой степенью привязки в TreeViews:

TreeViewHelper и Рекурсивный частичный просмотр

В дополнение к другим менее ссылочным статьям (верхние 3 также очень информативны):

Я хотел бы использовать либо TreeViewHelper, либо метод рекурсивного частичного просмотра.
Тем не менее, в TreeViewHelper я не могу заставить его извлекать данные из второй таблицы (т.е. Я могу только перечислить файлы, но я не уверен, как это перечислить документы для каждого файла.)
Для рекурсивного частичного просмотра я все еще не в состоянии преобразовать это в MVC3, а также в общую реализацию. Я нашел сообщение (forums.asp.net/t/1652809.aspx/1?treeview+with+mvc +3), в котором объясняется, как его преобразовать в MVC3, но я все еще не понимаю Что с этим делать. Я продолжаю получать ошибку для частичного представления: не может неявно преобразовать тип 'void' в тип 'object'

Как я уже говорил, я новичок в MVC3 и хотел бы узнать, какой метод лучше всего подходит для моего сценария и как его реализовать.

Ответ 1

В случае, если кто-то задается вопросом, как я решил эту проблему, было использовать рекурсивное частичное представление. Проблема, с которой я столкнулся, заключалась в том, что у меня не было отношений, связанных со ссылкой, в SQL/EF (у меня просто было поле ParentID, которое не было связано с Первичным ключом.) Я также интегрировал jsTree, поскольку это много гладких функций, таких как поиск.

Как я уже сказал в комментарии выше, @Html.Action и @Html.Partial вместо @Html.RenderAction и @Html.RenderPartial.

Ответ 3

    $(document).ready(function () {
        BindChart();
    });
    function BindChart() {
        $("#org").jOrgChart({
            chartElement: '#chart',
            dragAndDrop: true
        });
    }
    $(".cardadd").live("click", function ()
    {
        var data = { id: 0 , ParentId:$(this).parent().data('cardid')};
        OpenForminWindow('divfrmChartMember', 'divChartMember', 'frmChartMember', chart.ChartMember, data, '', 400, 1000);
    });
    $(".cardedit").live("click", function () {
        var data = { id: $(this).parent().data('cardid')};
        OpenForminWindow('divfrmChartMember', 'divChartMember', 'frmChartMember', chart.ChartMember, data, '', 400, 1000);
    });

    $(".cardremove").live("click", function () {

    });
    function OpenForminWindow(popupId, targetDivId, formid, url, data, callbackfunc, heigth, width) {
        $.ajax({
            type: "GET",
            url: url,
            data: data,
            cache: false,
            success: function (data) {
                $('#' + targetDivId).html(data);
                $('#' + formid).removeData('validator');
                $('#' + formid).removeData('unobtrusiveValidation');
                $('#' + formid).each(function () { $.data($(this)[0], 'validator', false); }); //enable to display the error messages
                $.validator.unobtrusive.parse('#' + formid);
                if (callbackfunc)
                    return callbackfunc();
            }
        });

        $("#" + popupId).dialog({
            modal: true,
            height: heigth,
            width: width,
            beforeClose: function (event, ui) {
                if (typeof refresh !== 'undefined' && refresh == true)
                    ReloadCurrentPage();
            }
        });
    }
    $('#frmChartMember').live('submit', function (e) {
        SubmitAjaxForm($(this).attr('id'), chart.AddMember, ReloadChart);
        e.preventDefault();
    });
    function SubmitAjaxForm(formId, url, callBack) {
        $.ajax({
            url: url,
            type: 'post',
            cache: false,
            data: $('#' + formId).serialize(),
            success: function (data) {
                return callBack(data);
            },
        });
    }
    function ReloadChart(result) {
        ClosePopup('divfrmChartMember');
        $.ajax({
            type: 'GET',
            url: chart.ChartList,
            cache: false,
            success: function (result) {
                $("#orgChart").html(result);
                BindChart();

            }
        });
    }
    function ClosePopup(divid) {
        $("#" + divid).dialog("close");

    }

открытый класс ChartController: контроллер   {       //       //GET:/Chart/       ChartContext ctx = new ChartContext();       общедоступный индекс ActionResult()       {           return View();       }       public ActionResult OrgChart()       {           return PartialView ( "_ OrgChart", ctx.Cards.ToList());       }       public ActionResult ChartMember (int id, int? ParentId = null)       {           Card card = new Card();           если (id > 0)               card = ctx.Cards.Find(id);           еще               card.ParentId = ParentId;           return PartialView ( "_ ChartMember", карточка);       }       public ActionResult SaveMember (карточная карточка)       {           if (card.id == 0)               ctx.Cards.Add(карта);           еще               ctx.Entry(card).State = System.Data.EntityState.Modified;           ctx.SaveChanges();           return Json (true, JsonRequestBehavior.AllowGet);       }   }