#c# #ajax #asp.net-core
#c# #ajax #asp.net-core
Вопрос:
У меня есть объект, который я хочу передать контроллеру. Этот объект содержит несколько строк, содержащих разные разделы HTML-кода. Мой код работал для обычных передаваемых строк, но как только я попытался добавить HTML-код, он больше не смог маршрутизировать, и я начал получать 404s.
Я попытался изменить модель, чтобы закодировать строку перед ее передачей, однако это не удалось полностью. Следующий код работает, если 3 строки не содержат HTML-кода внутри. Примерные строки — это то, что я пытаюсь передать своему контроллеру через вызов ajax.
Javascript
var htmlString1 = '<div style="width: 100px;">Test html div 1</div>';
var htmlString2 = '<div style="width: 100px;">Test html div 2</div>';
var htmlString3 = '<div style="width: 100px;">Test html div 3</div>';
var htmlSectionContainer = {
htmlSection1: htmlString1,
htmlSection2: htmlString2,
htmlSection3: htmlString3
};
debugger;
$.ajax({
url: "@Url.Action("DisplayHtmlObjects", "Pages")",
method: "GET",
data: { "data": JSON.stringify(data) },
success: (response) => {
//do things
});
}
Модель
public class HtmlSectionContainer
{
//Article ids for each of the pivot section intros.
public string htmlSection1{ get; set; }
public string htmlSection2 { get; set; }
public string htmlSection3 { get; set; }
}
Действие контроллера
[HttpGet]
public IActionResult DisplayHtmlObjects(string data)
{
HtmlSectionContainer section = new HtmlSectionContainer();
if (data != null)
{
section = JsonConvert.DeserializeObject<HtmlSectionContainer>(data);
}
return View(section);
}
Фактический результат приведенных выше строк html равен 404.
Попытка закодировать отдельные строки внутри объекта по-прежнему дает мне 404.
var htmlSectionContainer = {
htmlSection1: encodeURI(htmlString1),
htmlSection2: encodeURI(htmlString2),
htmlSection3: encodeURI(htmlString3)
};
Прямо сейчас я вообще не нажимаю точку останова внутри действия контроллера. Я должен быть в состоянии нажать точку останова, а в параметре данных увидеть каждую из 3 строк.
Также незначительное улучшение, если это возможно, я бы предпочел иметь данные HtmlSectionContainer в качестве параметра вместо строковых данных в действии контроллера, когда я пытался это сделать, данные были нулевыми.
Комментарии:
1. Я пробовал это, и оба в порядке.404 означает неправильный URL. Убедитесь, что действие существует с
"@Url.Action("DisplayHtmlObjects", "Pages")"
Ответ №1:
В этом JS-коде есть синтаксическая ошибка, я думаю, что URL-адрес указан неправильно
$.ajax({
url: "@Url.Action("DisplayHtmlObjects", "Pages"),
method: "GET",
data: { "data": JSON.stringify(data) },
success: (response) => {
//do things
});
}
Это должно быть так, вы пропустили закрытие » это должно быть так
$.ajax({
url: '@Url.Action("DisplayHtmlObjects", "Pages")',
method: "GET",
data: { "data": JSON.stringify(data) },
success: (response) => {
//do things
});
}
Я заменил двойные кавычки «на одинарные кавычки» в этой строке
'@Url.Action("DisplayHtmlObjects", "Pages")'
Потому что внутри строки вы используете двойные кавычки, и это заставит JS подумать, что строка здесь закончилась.
А также вы передаете data
object JSON.stringify(data)
, но я не вижу, где была объявлена и заполнена эта переменная, вы используете переменную htmlSectionContainer
выше для установки HTML-данных. итак, я думаю, это должно быть так.
$.ajax({
url: '@Url.Action("DisplayHtmlObjects", "Pages")',
method: "GET",
data: { "data": JSON.stringify(htmlSectionContainer) },
success: (response) => {
//do things
});
}
Комментарии:
1. Каким-то образом я потерял закрытие «, когда я копировал код, но у меня это было в моем проекте. Я попробовал то, что вы предложили, с одинарными кавычками, к сожалению, это фактически не устраняет проблему. Я все еще получаю ту же проблему 404. Я помещаю оба
'@Url.Action("DisplayHtmlObjects", "Pages")'
и"@Url.Action("DisplayHtmlObjects", "Pages")"
в переменную, и оба они вычисляют правильный путь/Pages/DisplayHtmlObjects
, и, как я уже сказал, если у меня нет HTML-кода внутри моих строк, он проходит правильно. Похоже, это относится к HTML-коду внутри строки.2. Вам нужно убедиться, что ваше действие доступно по этому URL, попробуйте его в браузере с момента его
GET
или попробуйте указать явный URL / маршрут, используяRoute
атрибут над вашим действием3. Действие доступно в get, и если я сделаю это своим действием запуска по умолчанию. Я предполагаю, что моя кодировка не работает должным образом. Я собираюсь попробовать заменить строку экранированными кавычками вместо использования функции encodeURI, чтобы посмотреть, имеет ли это значение. Я полагаю, что он может пытаться дважды закодировать строковые параметры, и это может вызвать проблему? Если нет, я всегда могу обойти это, передав значение строки поиска и просто снова извлекая данные из базы данных. Я просто хотел минимизировать вызовы в БД, передавая html-данные из представления контроллеру в другое представление.