#c# #web-services #jquery-ui
#c# #веб-сервисы #jquery-пользовательский интерфейс
Вопрос:
У меня есть функция webservice, которая возвращает что-то вроде следующего:
- Новый Орлеан, Луизиана
- Нью-Йорк, New York
- Ньюарк, Нью-Джерси
Эти данные поступают из следующей функции:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string[] GetCitiesWithState(string isoalpha2, string prefixText)
{
var dict = AtomicCore.CityObject.GetCitiesInCountryWithStateAutocomplete(isoalpha2, prefixText);
string[] cities = dict.Values.ToArray();
return cities;
}
Это работает замечательно, но что мне действительно нужно, так это такой список:
- 12, Новый Орлеан, Луизиана
- 22, Нью-Йорк, New York
- 48, Ньюарк, Нью-Джерси
С #, являющимся идентификатором города (он содержится с dict
, который является типом: Dictionary<int, string>
).
Причина, по которой я это делаю, заключается в том, что у меня есть некоторый Jquery, который считывает службу ASMX и этот метод, и мне нужно иметь возможность видеть идентификатор города выбранного города. Это мой Jquery для наглядности (который работает в настоящее время):
$('#<%=txtCity.ClientID%>').autocomplete({
source: function (request, response) {
var parameters = {
isoalpha2: '<%=Session["BusinessCountry"].ToString()%>',
prefixText: request.term
};
$.ajax({
url: '<%=ResolveUrl("~/AtomicService/Assets.asmx/GetCitiesWithState")%>',
type: 'POST',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(parameters),
success: function (data) {
response($.each(data.d, function (index, value) {
return {
label: value,
value: index
}
}));
}
});
},
select: function (event, ui) {
$('#<%=txtState.ClientID%>').val(ui.value);
},
minLength: 2,
delay: 500
});
Наконец, чего я на самом деле пытаюсь достичь, так это когда пользователь выбирает город в автозаполнении, который находится в режиме ожидания от: $('#<%=txtCity.ClientID%>')
, я бы хотел, чтобы Jquery разделил значение (например, Новый Орлеан, Луизиана на два (Новый Орлеан) и (Луизиана)), затем я бы хотел, чтобы «Новый Орлеан» был значением $('#<%=txtCity.ClientID%>')
, а «Луизиана» была значением $('#<%=txtState.ClientID%>')
… Всегда приветствуется любая помощь в запуске этого безумия 🙂
Ответ №1:
Если я вас правильно понял, вам просто нужно вернуть данные из веб-метода немного по-другому:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string[] GetCitiesWithState(string isoalpha2, string prefixText)
{
var dict = AtomicCore.CityObject.GetCitiesInCountryWithStateAutocomplete(isoalpha2, prefixText);
string[] response = dict.Select(x => String.Format("{0}, {1}", x.Key, x.Value)).ToArray();
return response;
}
И теперь, на стороне JavaScript, вам нужно разбить строку на index
и label
вручную (потому что то, что index
теперь — это просто номер строки, я полагаю). Что-то вроде этого (просто черновик):
response($.each(data.d, function (index, value) {
return {
label: value.slice(value.indexOf(',')),
value: parseInt(value.split(',')[0])
}
}));
Комментарии:
1. Отличный ответ A. 🙂 Большое спасибо. LINQ особенно эффективен!