none
JS и генерация Html разметки для DropDownList RRS feed

  • Вопрос

  • Проблема банальна, но решить не могу никак. 

    Есть "ведущий" DropDownList И некоторое количество "ведомых" DropDownList'ов, которые при загрузке страницы заполняются. Далее если пользователь на странице поменял значение "ведущего" происходит AJAX запрос к WebMethod'у страницы с целью получения данных и последующим заполнением "ведомых" DropDownList'ов.

    Подскажите, как оставить всё таки избавиться от ошибки "Недействительный аргумент обратной передачи или обратного вызова". 

    Поставить на странице или в конфиге enableEventValidation="false"  не очень хочется и очень хочется оставить текущую реализацию и не сбиваться на простановку свойства "AvtoPostBack=true" у DropDownList'ов.

    11 июля 2014 г. 8:41

Ответы

  • Нельзя смешивать два подхода. Так не будет работать. Придётся отключить валидацию если используете серверные контролы, для отдельных контролов отключение валидации не предусмотрено, поэтому нужно отключить для всей страницы. Используйте обычные контролы HTML и JS тогда. Или заполняйте значения через AJAX (UpdatePanel) без веб-метода, обычным AJAX постбеком.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Sergey Rogachev 16 июля 2014 г. 7:32
    15 июля 2014 г. 8:29
    Модератор

Все ответы

  • А какая версия фреймворка у вас?

    Сделаем содержимое сообщества лучше, вместе!

    11 июля 2014 г. 9:27
    Модератор
  • А почему не использовать UpdatePanel и не заполнять DDL на сервере, мне кажется ASP съест это с бОльшим удовольствием.
    11 июля 2014 г. 12:18
  • Framework 4.5.1
    12 июля 2014 г. 4:09
  • Съест то он съест. Но необходимо уменьшить обращения к серверу. 
    12 июля 2014 г. 4:10
  • Съест то он съест. Но необходимо уменьшить обращения к серверу. 
    Отключите ViewState. Если вы имеете ввиду трафик. 
    12 июля 2014 г. 8:16
  • Стоп. Вы хотите от первого дропдауна взять выбранные данные и отправить на метод webapi так? и затем заполнить вторичные дропдауны. Но в чем проблема? зачем эти 

    enableEventValidation="false" 

     UpdatePanel AvtoPostBack=true 

    ???

    отправьте GET запрос на метод контроллера, а ответ заполните в вторичные дропд. На jquery

    $.ajax({
      type: "GET",
      url: "MyControllerAndMyMethod", //здесь поменять
      data: { name: $("#myID option:selected").val() } //здесь поменять
    })
      .done(function( msg ) { //контроллер должен вернуть правильную структуру данных
        $('#myID').empty(); 
        $(msg).each(function(iIndex, sElement) {
            $('#myID').append('<option>' + sElement.Name + '</option>');
        });
      });
    public class HomeController:ApiController{
        public dropDown[] MyControllerAndMyMethod(string name){
             return new Dropdown[new Dropdown(){ID="test", Name="asd"}];
        }
    }
    public class dropDown{
    public string ID {get;set;}
    public string Name {get;set;}
    }



    Вот и все


    if (Thread.Was == HelpFul) Mark.As(HelpFul); else if (Thread.Was == Answered) Mark.As(Answered); else Provide(More.Details);




    12 июля 2014 г. 8:31
  • Вот и все




    Думаю что автор топика примерно так и делает.
    12 июля 2014 г. 9:06
  • точнее делаю так:

    $('#DateStartTextBox').datepicker({
                    changeMonth: true,
                    changeYear: true
                }).change(function () {
                    $.ajax({
                        type: "POST",
                        url: "AviaTrip.aspx/GetAviaTripsList",
                        data: "{ tripDate : '" + $(this).val() + "'}",
                        contentType: "application/json; charset=utf-8",
                        dataType: "json",
                        success: function (response) {
                            aviaTripsLocal = JSON.parse(response.d);
                            var control = $('#AviaTripDropDownList').empty();
                            $.each(aviaTripsLocal, function (idx, aviatrip) {
                                jQuery('<option value=' + aviatrip.Id + '>' + aviatrip.Name + '</option>').appendTo(control);                            
                            });
                            $(control).select2("val", aviaTripsLocal[0].Id);
                            $(control).change();
                        },
                        error: function (xhr, ajaxOptions, thrownError) {
                            alert(xhr.responseText);
                            return false;
                        }
                    });
                });
    
                $('#AviaTripDropDownList').on("change", function (e) {
                    var control = $('#AviaTripTypeDropDownList').empty();
                    $('#tripAviaInfo').remove();
                    $.each(aviaTripsLocal, function(idx,avia) {
                        if (avia.Id == e.val) {                        
                            if (avia.IsBlock)
                                jQuery('<option value="1">Блочный</option>').appendTo(control);
                            if (avia.IsSchedul)
                                jQuery('<option value="0">Регулярный</option>').appendTo(control);                        
                        }
                    });
                    jQuery('<option value="2">Без билета</option>').appendTo(control);
                    $(control).select2("val", "2");
                });

    а на серверной стороне:

    [WebMethod]
            public static string GetAviaTripsList(string tripDate)
            {
                try
                {
                    var aviaTrips = AviaTripsModel.LoadAviaTripByDate(DateTime.Parse(tripDate));
    
                    var list = new List<object>();
    
                    foreach (var aviaTrip in aviaTrips.Where(o => o.RegionStart != null && o.RegionFinish != null))
                    {
                        list.Add(new
                        {
                            Id = aviaTrip.Id,
                            Name = aviaTrip.RegionStart.Name + " → " + aviaTrip.RegionFinish.Name,
                            IsBlock = aviaTrip.IsBlockFlight,
                            IsSchedul = aviaTrip.IsScheduledFlight
                        });
                    }
    
                    return new JavaScriptSerializer().Serialize(list);
                }
                catch (Exception)
                {
                    return new JavaScriptSerializer().Serialize(new
                    {
                        TripDate = tripDate,
                        Error = "Ошибка при загрузке авиарейсов за выбранную дату"
                    });
                }                        
            }

    13 июля 2014 г. 6:26
  • ну и где вываливается exception?

    и почему static?


    if (Thread.Was == HelpFul) Mark.As(HelpFul); else if (Thread.Was == Answered) Mark.As(Answered); else Provide(More.Details);


    13 июля 2014 г. 10:59
  • Ошибка вылетает при отправке всей формы.

    Static - потому что так оформляется WebMethod

    14 июля 2014 г. 1:30
  • Нельзя смешивать два подхода. Так не будет работать. Придётся отключить валидацию если используете серверные контролы, для отдельных контролов отключение валидации не предусмотрено, поэтому нужно отключить для всей страницы. Используйте обычные контролы HTML и JS тогда. Или заполняйте значения через AJAX (UpdatePanel) без веб-метода, обычным AJAX постбеком.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Sergey Rogachev 16 июля 2014 г. 7:32
    15 июля 2014 г. 8:29
    Модератор
  • Благодарю за ответ. 
    16 июля 2014 г. 7:32