Добавить в DropDownList по возвращаемому значению jQuery.Ajax - PullRequest
1 голос
/ 03 ноября 2011

У меня есть 2 DropDownList, как Master-Slave.Это мой Default.aspx:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <table>
            <tr>
                <td>
            <asp:Label ID="MsLbl" runat="server" Text="Groups" />
                </td>
                <td>
            <asp:DropDownList ID="Masterddl" runat="server">
                    <asp:ListItem Text="G1" Value="G1" />
                    <asp:ListItem Text="G2" Value="G2" />
                    <asp:ListItem Text="G3" Value="G3" />
            </asp:DropDownList>
                </td>
            </tr>
            <tr>
                <td>
            <asp:Label ID="Svlbl" runat="server" Text="Members" />
            </td>
                <td>
            <asp:DropDownList ID="Slaveddl" runat="server" />
            </td>
            </tr>
        </table>
    </div>
    </form>
</body>
</html>

И это мой скрипт:

$(document).ready(function () {
$('select#Masterddl').change(function () {
    MasterChangeHandler($(this).val());
});

function MasterChangeHandler(Value) {
    $.ajax({
        type: 'Post',
        url: 'MasterSlaveHandler.ashx',
        dataType: "text",
        data: 'ItemSelected=' + Value,
        async: 'true',
        success: function (data) { SuccessHandler1(data); }

    });
}


function SuccessHandler1(data) {
    $('select#Slaveddl').empty();
    $.each(data, function (i, slaveValue) {
        $('select#Slaveddl').append(
    $('<option></option>').val(slaveValue.Value).html(slaveValue.Text)
    );
    });
}

И мой обработчик:

public class SlaveValues {
    public string Value { get; set; }
    public string Text { get; set; }
}


public class MasterSlaveDropDownListsHandler : IHttpHandler {
    public bool IsReusable {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context) {
        string valueSelected = context.Request["ItemSelected"];
        List<SlaveValues> slaveValues = new List<SlaveValues>();
        SlaveValues sv;

        sv = new SlaveValues();
        sv.Text = "SV1";
        sv.Value = valueSelected + "s1";
        slaveValues.Add(sv);

        sv = new SlaveValues();
        sv.Text = "SV2";
        sv.Value = valueSelected + "s2";
        slaveValues.Add(sv);


        string responseText =
    Newtonsoft.Json.JsonConvert.SerializeObject(slaveValues);
        context.Response.ContentType = "text/json";
        context.Response.Write(responseText);
    }
}

, но добавить нечего,Кроме того, я вижу ответ в окнах Firebug следующим образом (когда я выбираю G2 из Master ddl):

[{"Value":"G2s1","Text":"SV1"},{"Value":"G2s2","Text":"SV2"}]

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

function SuccessHandler2(data) {
    $('select#Slaveddl').empty();
    $.each(data, function (i, slaveValue) {
        $('select#Slaveddl').append(
    $('<option></option>').val('Member' + i).html('Member' + i)
    );
    });
}

при попытке этого нового скрипта привязка к Slave ddl работает правильно, но с некоторыми дополнительными элементами: индекс показывает member0 to member30, и я не знаю, почему.

Edit1: я тоже пробую этот и добавляюправильно:

function SuccessHandler3(data) {
var values = [{ "Value": "G2s1", "Text": "SV1" }, { "Value": "G2s2", "Text": "SV2"}];
        $('select#Slaveddl').empty();
        $.each(values, function (i, slaveValue) {
            $('select#Slaveddl').append(
$('<option></option>').val('Member' + slaveValue.Value).html('Member' +
 slaveValue.Text)
        );
        });
    }

Так что я думаю, что есть проблема с манипулированием возвращаемым значением (данными).

для более конкретного просмотра на следующем рисунке показана вкладка JSON в окнах Firebug, когда я выбираюG3 в Master ddl:

JSON Tab in firebug

Edit2:

Также я пробую это, и появляется только первое предупреждение, по-видимому, (data.d) равно нулю илинеизвестный объект:

function SuccessHandler6(data) {
    var selection = $('select#Slaveddl');
    $(selection).children().remove();
    alert('in handler and remove children correctly');
    if (data.d) {
        alert('data.d is not null');
        $(data.d).each(function (index, item) {

$(selection).append('<option>').val(item.Value).html(item.Text);
            alert('after append in index: ' + index);
        });
    }
}

Как правильно использовать возвращаемое значение и добавить к ведомому ddl?В чем проблема?

Ответы [ 4 ]

1 голос
/ 21 ноября 2011

Может быть, это может быть полезно, так как у вашей проблемы есть полное пошаговое решение:

использовать возвращаемое значение JSON в JQuery

1 голос
/ 03 ноября 2011

ты должен попробовать вот так я думаю.

проверить это.

http://jsfiddle.net/rTua4/1/

var values = [{"Value":"G2s1","Text":"SV1"},{"Value":"G2s2","Text":"SV2"}];

   $.each(values , function (i, slaveValue) {

        $('#xxx').append(
    $('<option></option>').val(slaveValue.Value).html('Member' + slaveValue.Text)
        )});

для следующей операции попробуйте это.

function SuccessHandler1(data) {
    $('select#Slaveddl').empty();
    var m = JSON.parse(data);
    $.each(m , function (i, slaveValue) {
        $('select#Slaveddl').append(
    $('<option></option>').val(slaveValue.Value).html(slaveValue.Text)
    );
});

}

0 голосов
/ 03 ноября 2011

Хочу отметить, что то, что вы пытаетесь выполнить с помощью обработчика HTTP, обычно выполняется с помощью веб-службы или, точнее, веб-службы RESTful WCF.WCF даже обрабатывает сериализацию JSON для вас.Вот упрощенный пример, который вы можете просто адаптировать к вашим потребностям. Как вернуть чистый JSON из службы WCF?

Насколько мне известно, обработчики HTTP используются для обработки типов файлов (например, вы можете связать обработчик с "".jpeg "тип файла для динамического возврата" .jpeg "изображений).

Это" правильный "способ справиться с этим.

0 голосов
/ 03 ноября 2011

Эта ссылка поможет вам. Вам нужно получить только часть данных для отображения в вашем ведомом ddl. Чтобы получить только эту часть, вам нужно получить data.d .. Подробнее здесь: Eval response.d в Jquery Ajax

Вот и маленький пример:

$.ajax({ 
        url: 'Users.aspx/GetUsers', 
        type: "POST", 
        contentType: "application/json; charset=utf-8", 
        data: JSON.stringify(postdata), 
        dataType: "json", 
        success: function(data, st) { 
            if (st == "success") { 
                var m = JSON.parse(data.d); 
                //you can run your loop here to add to ddl
            } 
        }, 
        error: function() { 
            alert("Loading Failed!"); 
        } 
    }); 
...