Mitchell Schaff Ответов: 2

Передаются два параметра в JSON с помощью AJAX ASP.NET запроса в MVC


Привет,
У меня есть форма MVC с тремя полями на ней. Один из них-это метка с именем "Network_UID", второй-выпадающий список с именем "UNI_UID", а третий - "Current_Bandwidth". Они определяются в представлении следующим образом:

@Html.LabelFor(model => model.Network_UID)
@Html.DisplayFor(model => model.Network_UID, new { htmlAttributes = new { @class = "form-control" } })

@Html.LabelFor(model => model.UNI_UID, htmlAttributes: new { @class = "col-form-label col-md-2" })
@Html.DropDownList("UNI_UID", null, "Select One...", htmlAttributes: new { @class = "form-control" })

@Html.LabelFor(model => model.Current_Bandwidth, htmlAttributes: new { @class = "col-form-label col-md-2" })
@Html.DisplayFor(model => model.Current_Bandwidth, new { htmlAttributes = new { @class = "form-control" } })


Когда выбор сделан из выпадающего списка UNI_UID, я бы хотел, чтобы страница сделала AJAX-вызов подпрограммы в контроллере с именем "FetchBandwidth", которая вернет десятичное значение. Процедура кодируется в контроллере следующим образом:

public JsonResult FetchBandwidth(int UNIID, int NetworkID)
{
    decimal CurBandwidth = 0;
    // Calculate the bandwidth based on the two parameters
    CurBandwidth = 10;   // set it to 10 for now
    var data = new { Value = 0, Text = CurBandwidth.ToString() };
    return Json(data, JsonRequestBehavior.AllowGet);
}

В представлении у меня есть следующий сценарий:

<script type="text/javascript">
    var newBW = $('#New_Bandwidth');
    var bwUrl = '@Url.Action("FetchBandwidth")';
    var curBW = $('#Current_Bandwidth');
    $('#UNI_UID').change(function () {
        $.getJSON(bwUrl, { UNIID: $(this).val(), NetworkID: ('#Network_UID').val() }, function (data) {
            if (!data) {
                return;
            }
            $.each(data, function (index, item) {
                curBW.val(item.Text);
            });
        })
    })
</script>


Как вы можете видеть, я пытаюсь передать оба значения из поля "UNI_ID" и поля "Network_UID" в метод FetchBandwidth, но получаю ошибку "Object doesn't support property or method 'val'" из браузера. Я новичок в JQuery/AJAX, поэтому не знаю, правильно ли я вызываю FetchBandwidth или нет.

Что я уже пробовал:

Если я удаляю код "NetworkID: ('#Network_UID').val()" из скрипта и удаляю параметр из объявления FetchBandwidth в контроллере, значение UNI_UID передается правильно. В этом случае мне нужно передать оба значения. Мне интересно, может ли кто-нибудь дать какие-либо идеи по этому поводу?

Спасибо!

MadMyche

Можете ли вы добавить в самом деле Визуализированный HTML, в отличие от кода представления?

2 Ответов

Рейтинг:
15

F-ES Sitecore

('#Network_UID').val()


Вы вызываете "val" на ('#Network_UID'), который является просто строкой, он не поддерживает val. Вы хотели использовать $('#Network_UID'), который создает новый объект jQuery ("$"- псевдоним функции jQuery), передавая #Network_UID в качестве параметра, который заставит jQuery возвращать объект, который обертывает элемент с идентификатором Network_UID, и этот объект jQuery поддерживает "val"

$.getJSON(bwUrl, { UNIID: $(this).val(), NetworkID: $('#Network_UID').val() }, function (data) {


Mitchell Schaff

Спасибо за разъяснение, ваш ответ определенно изменил ситуацию!

Один связанный с этим вопрос: после внесения этого изменения я получаю ответ, который
Цитата:
"Индекс" представления или его мастер не были найдены или ни один механизм представления не поддерживает искомые местоположения. Были проведены обыски в следующих местах:
~/Вид индекса/bandwidthchange/.aspx-файл
~/Вид индекса/bandwidthchange/.ascx вносятся
~/Views/Shared/Index.aspx
~/Вид Индекса/Общая/.ascx вносятся
~/Вид индекса/bandwidthchange/.cshtml по
~/Вид индекса/bandwidthchange/.vbhtml по
~/Views/Shared/Index.cshtml
~/Views/Shared/Index.vbhtml
Но это озадачивает меня, потому что он правильно находит метод FetchBandwidth в контроллере, если я определяю метод только с одним параметром и передаю один параметр из вызова .getJSON. Теперь, однако, с помощью метода, определенного как
Скрыть Код Скопировать
public JsonResult FetchBandwidth(int UNIID, int NetworkID)
и вызов .getJSON исправлен, чтобы правильно передать второй параметр, процедура вызывает ошибку show выше. Для справки, представление называется Edit.cshtml, а контроллер-BandwidthChangecontroller.cs

Есть какие-нибудь намеки на то, что может быть причиной ошибки?

F-ES Sitecore

Поставьте как действие, так и контроллер в Url.Action

'@Url.Action("FetchBandwidth", "ControllerName")';

Mitchell Schaff

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

Однако, когда я внес предлагаемое изменение, добавив знак $ перед ссылкой, страница все еще не вызывает метод bwURL. Если я пытаюсь отладить скрипт в IE 11, он анализирует строку вызова .getJSON кода, но, похоже, никогда не добирается до кода "if (!data)". Что-то не совсем правильно с этим звонком, но IE не дает мне никакой информации о том, в чем проблема. Я был бы признателен за любые указания на этот счет. Спасибо!

Mitchell Schaff

При выполнении страницы в Chrome сообщается о следующей ошибке:
библиотека jQuery-3.3.1.ДШ:9600 вам http://localhost:54979/bandwidthchange/FetchBandwidth?UNIID=1539 500 (Внутренняя ошибка сервера)

Простите меня, если это вопрос новичка, но должен ли этот метод JsonResult быть методом Post, а не методом Get?

Рейтинг:
0

Mitchell Schaff

Спасибо за разъяснение, ваш ответ определенно изменил ситуацию!

Один связанный с этим вопрос: после внесения этого изменения я получаю ответ, который

Цитата:
"Индекс" представления или его мастер не были найдены или ни один механизм представления не поддерживает искомые местоположения. Были проведены обыски в следующих местах:
~/Вид индекса/bandwidthchange/.aspx-файл
~/Вид индекса/bandwidthchange/.ascx вносятся
~/Views/Shared/Index.aspx
~/Вид Индекса/Общая/.ascx вносятся
~/Вид индекса/bandwidthchange/.cshtml по
~/Вид индекса/bandwidthchange/.vbhtml по
~/Views/Shared/Index.cshtml
~/Views/Shared/Index.vbhtml
Но это озадачивает меня, потому что он правильно находит метод FetchBandwidth в контроллере, если я определяю метод только с одним параметром и передаю один параметр из вызова .getJSON. Теперь, однако, с помощью метода, определенного как
public JsonResult FetchBandwidth(int UNIID, int NetworkID)
и вызов .getJSON исправлен, чтобы правильно передать второй параметр, процедура вызывает ошибку show выше. Для справки, представление называется Edit.cshtml, а контроллер-BandwidthChangecontroller.cs

Есть какие-нибудь намеки на то, что может быть причиной ошибки?


Richard Deeming

Если вы хотите ответить на решение, нажмите кнопку "есть вопрос или комментарий?" нажмите кнопку под этим решением и оставьте комментарий.

Не опубликуйте свой комментарий как новое "решение".

Mitchell Schaff

Спасибо, что предупредили об этом. Это была моя оплошность.