Как передать объект контроллеру, который содержит строку html в .NETCore

#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-данные из представления контроллеру в другое представление.