Я надеюсь, что разработчики могут поддержать меня, у меня есть минимальный опыт использования java-скрипта.
После исследования и нескольких попыток я смог загрузить выпадающий список с данными из запроса LINQ и передать в качестве параметра значение текстового поля.
То, что я не мог сделать, - это выполнить запрос Linq, чтобы получить два поля (Id и значение), отправить их в раскрывающийся список и показать значение, но после того, как вы сможете использовать Id этого поля, чтобы использовать его в создании, в настоящее время я может показывать только значение, но мне нужен ИД.
Посмотреть
@Html.TextBox("CP", "", new { @id = "txtCP", @onchange = "FillOption();", @placeholder = "Codigo Postal" })
@Html.DropDownList("Asentamientos", ViewBag.Drop as List<SelectListItem>)
скрипт
<script>
function FillOption() {
var CP = $('#txtCP').val();
$.ajax({
type: "Post",
url: "/Home/GetAsentamiento",
data: { CP: CP },
dataType: 'json',
success: function (data) {
$("#Asentamientos").empty();
for (var i = 0; i < data.length; i++) {
$('#Asentamientos').append('<option value=' + data[i].Value + '>' + data[i].Text + '</option > ');
}
}
});
}
</script>
Контроллеры
public ActionResult Index()
{
List<SelectListItem> drop = new List<SelectListItem>
{
};
ViewBag.Drop = drop;
return View();
}
[HttpPost]
public ActionResult GetAsentamiento(string CP)
{
var drop2 = (from p in db.CodigosPostales where p.CodigoPostal == CP select p.Asentamiento).ToList();
SelectList lista = new SelectList(drop2);
ViewBag.lista = lista;
return Json(ViewBag.lista);
}
Я думаю о чем-то вроде
[HttpPost]
public ActionResult GetAsentamiento(string CP)
{
var drop2 = (from p in db.CodigosPostales where p.CodigoPostal == CP select new { p.IdCodigoPostal,p.Asentamiento}).ToList();
SelectList lista = new SelectList(drop2);
ViewBag.lista = lista;
return Json(ViewBag.lista);
}
но я не знаю, как будет обрабатываться идентификатор и значение
Спасибо
Я подозреваю, что ваша проблема связана с извлечением данных из результата API. Вы устанавливаете новое свойство в ViewBag, а затем возвращаете свойство ViewBag. Это действительно не требуется, и вместо этого вы должны просто вернуть список, перечислите его так: (Примечание: и SelectItemList имеет свойство "Элементы", которое содержит все элементы, которые вы добавили):
[HttpPost]
public ActionResult GetAsentamiento(string CP)
{
var drop2 = (from p in db.CodigosPostales where p.CodigoPostal == CP select new { p.IdCodigoPostal,p.Asentamiento}).ToList();
SelectList lista = new SelectList(drop2);
return Json(lista.Items);
}
Это должно вернуть только хороший список ListItems. Вы также можете просто изменить jQuery для циклического перехода через свойство items, например:
<script>
function FillOption() {
var CP = $('#txtCP').val();
$.ajax({
type: "Post",
url: "/Home/GetAsentamiento",
data: { CP: CP },
dataType: 'json',
success: function (data) {
$("#Asentamientos").empty();
for (var i = 0; i < data.Items.length; i++) {
$('#Asentamientos').append('<option value=' + data.Items[i].Value + '>' + data.Items[i].Text + '</option > ');
}
}
});
}
</script>
Если я правильно понял ваш вопрос, я думаю, вам нужно называть поля объекта, который вы создаете, с выражением Linq, чтобы он выглядел примерно так:
[HttpPost]
public ActionResult GetAsentamiento(string CP)
{
var drop2 = (from p in db.CodigosPostales where p.CodigoPostal == CP select new { id = p.IdCodigoPostal, value = p.Asentamiento}).ToList();
SelectList lista = new SelectList(drop2);
ViewBag.lista = lista;
return Json(ViewBag.lista);
}
Вот несколько примеров: https://code.msdn.microsoft.com/LINQ-to-DataSets-09787825#SelectAnonymousTypes1
Затем вы можете получить доступ к этим полям из javascript с data[i].id
и data[i].value
. Надеюсь, это поможет.
Благодаря коду, код работает следующим образом
контроллер
[HttpPost]
public ActionResult GetAsentamiento(string CP)
{
var drop2 = (from p in db.CodigosPostales where p.CodigoPostal == CP select new { Value = p.IdCodigoPostal, Text= p.Asentamiento }).ToList();
SelectList lista = new SelectList(drop2);
return Json(lista.Items);
}
скрипт
<script>
function FillOption() {
var CP = $('#txtCP').val();
$.ajax({
type: "Post",
url: "/Home/GetAsentamiento",
data: { CP: CP },
dataType: 'json',
success: function (data) {
$("#Asentamientos").empty();
for (var i = 0; i < data.length; i++) {
$('#Asentamientos').append('<option value=' + data[i].Value + '>' + data[i].Text + '</option > ');
}
}
});
}