MonoRail - выберите родительскую категорию из одного раскрывающегося списка, покажите раскрывающийся список дочерней категории

Я новичок в MonoRail и пытаюсь понять, как это сделать, чтобы я мог выбрать родительскую категорию в раскрывающемся списке, а затем показать второй раскрывающийся список с категориями, которые являются дочерними для родительского элемента.

Если бы я использовал то, к чему привык, ASP.NET MVC, у меня была бы функция javascript, которая вызывалась бы при изменении первого раскрывающегося списка и выполняла бы вызов ajax для метода контроллера (передавая идентификатор выбранной родительской категории) который захватит все дочерние категории этой родительской категории и вернет их в формате JSON. Затем в функции javascript обратного вызова я бы оценил JSON и заполнил второе раскрывающееся меню дочерними категориями.

Как мне это сделать с помощью MonoRail / jQuery? Вот код, который у меня есть:

$FormHelper.Select("business.category.id", $categories, "%{value='id', text='name', firstoption='Select a Category'}")

$FormHelper.Select("business.category.id", $childCategories, "%{value='id', text='name', firstoption='Select a Sub-Category'}")

Затем в BusinessController.cs:

private void AddDataToModels()
        {
            PropertyBag["categories"] = CategoryRepository.GetParentCategories();
            PropertyBag["childCategories"] = CategoryRepository.GetChildCategories(1);
}

Спасибо за любой вклад о том, как подойти к этому!

Джастин


person Justin    schedule 27.05.2010    source источник


Ответы (2)


Посмотрите, поможет ли это:

http://ayende.com/Blog/archive/2007/10/08/Cascading-Drop-Downs-in-MonoRail.aspx

person PatrickSteele    schedule 27.05.2010
comment
Спасибо, я действительно видел эту статью после того, как опубликовал, но он использует файл .ashx для выполнения серверного вызова из ajax. Как мне вызвать действие контроллера из ajax? Это дает мне то, что MonoRail не может разрешить экземпляр механизма просмотра для шаблона ... - person Justin; 28.05.2010
comment
Вот небольшой пост, который я недавно написал об использовании ajax в Monorail. Он использует прототип, но та же концепция будет работать и для jQuery: weblogs.asp.net/psteele/archive/2008/09/15/ - person PatrickSteele; 28.05.2010
comment
Этот метод не подходил для моей ситуации, поскольку он в основном возвращает все представление, слишком сильно напоминает мне панели обновления из ASP.NET. Я искал способ вернуть JSON и разобраться с этим, а не со всем представлением. Тем не менее, я даю вам ответ, так как вы привели меня на правильный путь и были единственными, кто ответил, спасибо за вашу помощь !! - person Justin; 28.05.2010
comment
Спасибо, Джастин. Другой подход, который использовали некоторые люди, - всегда возвращать json, а затем использовать библиотеку шаблонов javascript для генерации HTML на клиенте (опять же, я слышал об этом, но не пробовал). - person PatrickSteele; 28.05.2010

Вот ответ для тех, кто хочет вызывать действия контроллера из jQuery и возвращать JSON ...

Метод контроллера:

[return: JSONReturnBinder(Properties = "Id,Name")]
        public BusinessType[] GetChildBusinessTypes(int parentId)
        {
            var businessTypes = BusinessTypeRepository.GetChildBusinessTypes(parentId);
            return businessTypes;
        }

Javascript:

$(document).ready(function () {
        $('#business_parentbusinesstype_id').change(function () {
            jQuery.ajax({
                url: "$UrlHelper.For("%{action='$business.site.id/GetChildBusinessTypes'}")",
                data: { parentId: $('#business_parentbusinesstype_id').val() },
                dataType: 'json',
                type: 'GET',
                success: fillChildBusinessTypes,
                error: ajaxError
            });
        });
    });

    function fillChildBusinessTypes(json) {
        //get business types.
        var businessTypes = eval(json);
        //bind business types to dropdown.
        $("#business_businesstype_id").get(0).options.length = 0;
        $("#business_businesstype_id").get(0).options[0] = new Option("Select a Business Type", "0");
        jQuery.each(businessTypes, function(index, item) {
            $('#business_businesstype_id').get(0).options[$("#business_businesstype_id").get(0).options.length] = new Option(item.Name, item.Id);
        });
        //show child dropdown.
        Show($('#spnChildBusinessTypes'));
    }
person Justin    schedule 28.05.2010