Веб-сервис ASMX, не возвращая JSON, может только POST с помощью application/x-www-form-urlencoded contentType

Ответ Vexe работал лучше всего для меня, но мне пришлось изменить его, чтобы исправить пару проблем. Это решение выделит правильный объект, если один и тот же объект находится в списке несколько раз. Кроме того, это решение предотвращает переворот нескольких выбранных объектов, когда они попадают в верхнюю или нижнюю часть списка, а кнопка продолжает нажиматься несколько раз.

    private void btnMoveUp_Click(object sender, EventArgs e)
    {
        // find the lowest index of non selected items
        int lowestIndexNotSelected = listBox.Items.Count - 1;
        for (int i = listBox.Items.Count - 1; i >= 0; i--)
        {
            if (!listBox.SelectedIndices.Contains(i))
            {
                lowestIndexNotSelected = i;
            }
        }

        listBox.BeginUpdate();
        int numberOfSelectedItems = listBox.SelectedItems.Count;
        for (int i = 0; i < numberOfSelectedItems; i++)
        {
            // only if it's not a lower inde than the lowest non selected index
            if (listBox.SelectedIndices[i] > lowestIndexNotSelected)
            {
                // the index of the item above the item that we wanna move up
                int indexToInsertIn = listBox.SelectedIndices[i] - 1;
                // insert UP the item that we want to move up
                listBox.Items.Insert(indexToInsertIn, listBox.SelectedItems[i]);
                // removing it from its old place
                listBox.Items.RemoveAt(indexToInsertIn + 2);
                // highlighting it in its new place (by index, to prevent highlighting wrong instance)
                listBox.SelectedIndex = indexToInsertIn;
            }
        }
        listBox.EndUpdate();
    }

    private void btnMoveDown_Click(object sender, EventArgs e)
    {
        // find the highest index of non selected items
        int highestIndexNonSelected = 0;
        for (int i = 0; i < listBox.Items.Count; i++)
        {
            if (!listBox.SelectedIndices.Contains(i))
            {
                highestIndexNonSelected = i;
            }
        }

        listBox.BeginUpdate();
        int numberOfSelectedItems = listBox.SelectedItems.Count;
        // when going down, instead of moving through the selected items from top to bottom
        // we'll go from bottom to top, it's easier to handle this way.
        for (int i = numberOfSelectedItems - 1; i >= 0; i--)
        {
            // only if it's not a higher index than the highest index not selected
            if (listBox.SelectedIndices[i] < highestIndexNonSelected)
            {
                // the index of the item that is currently below the selected item
                int indexToInsertIn = listBox.SelectedIndices[i] + 2;
                // insert DOWN the item that we want to move down
                listBox.Items.Insert(indexToInsertIn, listBox.SelectedItems[i]);
                // removing it from its old place
                listBox.Items.RemoveAt(indexToInsertIn - 2);
                // highlighting it in its new place (by index, to prevent highlighting wrong instance)
                listBox.SelectedIndex = indexToInsertIn - 1;
            }
        }
        listBox.EndUpdate();
    }
8
задан John Saunders 22 May 2009 в 23:57
поделиться

7 ответов

Похоже, вам нужно указать json в качестве формата ответа в теге scriptMethod. Это с vb.net, но я уверен, что вы уловили идею:

ResponseFormat: = ResponseFormat.Json

-1
ответ дан 6 December 2019 в 00:59
поделиться

не уверен, может ли это быть так просто, но я использую jQuery для обратного вызова JSON из моих веб-методов.

основное отличие, которое я вижу, - это атрибут класса

[System.Web.Script.Services.ScriptService]

    [WebService(Namespace = "http://MyNameSpace")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.Web.Script.Services.ScriptService]
    public class Web : System.Web.Services.WebService{

       [WebMethod]
       public string TestMethod(){
         return "Testing";
       }

    }

Я должен предположить, что вы используете фреймворк 3.5, потому что это единственный способ раскрыть веб-методы JSON.

Мои вызовы из jQuery выглядят практически одинаково, поэтому проблем нет.

0
ответ дан 6 December 2019 в 00:59
поделиться

Если вы тестируете это в IE, попробуйте удалить объявление кодировки из вашего атрибута contentType (т.е. оно должно выглядеть следующим образом:

contentType: "application/json",

Мне еще предстоит выяснить, почему, но IE, похоже, не совсем прав при выполнении вызовов JSON с " charset = UTF -8 "часть.

alt text

0
ответ дан 6 December 2019 в 00:59
поделиться

Я думаю, вы ищете атрибут WebInvoke или WebGet, он позволяет вам указать шаблон Uri, стиль тела, форматы запроса и ответа, например:

[WebGet(ResponseFormat= WebMessageFormat.Json)]

Эта ссылка может помочь . Есть аналогичная статья для WebInvoke (используется в основном для сообщений).

0
ответ дан 6 December 2019 в 00:59
поделиться

Я довольно часто использую вызовы JQuery AJAX JSON для веб-службы ASMX. Он отлично работает во всех браузерах. Я использую .NET 2.0 с установленными расширениями ASP.NET AJAX (в комплекте 3.5).

Мой класс имеет те же декораторы, что и ваш. Мои методы имеют только декоратор [WebMethod (EnableSession = true)] . Однако мой web.config имеет следующую запись в разделе httpHandlers:

<add verb="*" path="*jsonservice.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />

Мой вызов jquery выглядит следующим образом:

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "path/to/service/jsonservice.asmx/MethodName",
    data: JSON.stringify(DTO),
    dataType: "json",
    success: function(rtrn) { alert("good"); },
    error: function(req, msg, err) { alert("bad"); }
});

Эта статья является корнем моих знаний.

0
ответ дан 6 December 2019 в 00:59
поделиться

У меня это работает в версии 2.0 с использованием веб-служб, но я установил защиту от .d (см. DataFilter ниже). Я также возвращаю массив объектов. ПРИМЕЧАНИЕ: класс объекта статический, иначе он не работал бы у меня, по крайней мере.

  $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        data: "{}",
        dataFilter: function(data)
        {
            var msg;
            if (typeof (JSON) !== 'undefined' &&
                typeof (JSON.parse) === 'function')
                msg = JSON.parse(data);
            else
                msg = eval('(' + data + ')');
            if (msg.hasOwnProperty('d'))
                return msg.d;
            else
                return msg;
        },
        url: "webservice/ModifierCodesService.asmx/GetModifierList",
        success: function(msg)
        {
            LoadModifiers(msg);
        },
        failure: function(msg)
        {
            $("#Result").text("Modifiers did not load");
        }
    });

Вот фрагмент моей веб-службы:

...

[WebService(Namespace = "http://mynamespace.com/ModifierCodesService/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[ScriptService]
public class ModifierCodesService : System.Web.Services.WebService
{

     /// <summary>
    /// Get a list of Modifiers
    /// </summary>
    /// <returns></returns>
    [WebMethod(EnableSession = true)]
    public Modifier[] GetModifierList()
    {
        return GetModifiers();
    }
       /// <summary>
        /// Modifiers list from database
        /// </summary>
        /// <returns></returns>
        private Modifier[] GetModifiers()
        {
            List<Modifier> modifier = new List<Modifier>();
            ModifierCollection matchingModifiers = ModifierList.GetModifierList();
            foreach (Modifier ModifierRow in matchingModifiers)
            {
                modifier.Add(new Modifier(ModifierRow.ModifierCode, ModifierRow.Description));
            }
            return modifier.ToArray();
        }
    }

...

объект код:

 public static class ModifierList
    {

        /// <summary>
        /// Returns the Modifier Collection.
        /// </summary>
        /// <param name="prefix"></param>
        /// <returns></returns>
        public static ModifierCollection GetModifierList()
        {
3
ответ дан 6 December 2019 в 00:59
поделиться

Сегодня я боролся с этим, когда приложение для iPhone взаимодействовало с веб-службой .Net.

Я обнаружил, что если я изменил свой Content Type на application / jsonrequest, все прошло без проблем, и я смог обработать данные на моем веб-сервере.

Просто для усмешки я добавил упомянутую выше строку в свой web.config, но она не заставила application / json работать.

1
ответ дан 6 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: