C# Внедрение JavaScript в представление с использованием JsonResult

Привет всем! У меня возник вопрос по C#. Я работаю над проектом, где мне нужно добавить и выполнить JavaScript в зависимости от успешности выполнения метода контроллера. Проблема в том, что метод возвращает JsonResult, а не View.

Я пробовал использовать ActionFilter с методом OnActionExecuted, но не могу найти способ добавить скрипт, так как нет ViewResult. Может кто-нибудь подсказать, как решить эту задачу или предложить альтернативный подход?

Вот пример кода контроллера:

[ВставитьJavascript]
public async Task<ActionResult> Создать(СтраницаСозданияАккаунта текущаяСтраница, МодельСозданияАккаунта модель)
{
    // логика здесь
    
    return Json(new
    {
        успех = true,
        адресПеренаправления = false,
        html = строкаЧастичногоПредставления,
        неверныеПоля = НеверныеПоля
    });
}

Запрос выполняется из Ajax-формы в частичном представлении. Буду благодарен за любую помощь!

В твоем случае лучше обрабатывать ответ на стороне клиента. В успешном колбэке Ajax-запроса можно проверять поле успех и выполнять нужный JS-код. Примерно так:

$.ajax({
  // ...
  success: function(response) {
    if (response.успех) {
      // Выполняем нужный JS-код
      console.log('Успех!');
    } else {
      // Обрабатываем ошибку
    }
  }
});

Так код будет чище и его проще поддерживать. Плюс это соответствует принципу разделения ответственности.

слушай, а что если попробовать передавать в json-ответе не только данные, но и какой-то флаг для выполнения js? типа так:

return Json(new {
успех = true,
выполнитьJs = “showSuccessMessage()”
});

а на клиенте в обработчике ajax-ответа проверять этот флаг и если он есть - выполнять указанный js-код через eval() или new Function().

конечно, нужно быть осторожным с безопасностью, но для внутренних задач вполне рабочий вариант. главное не забыть валидировать на сервере, какой именно js можно передавать :slight_smile:

Согласен с предыдущим ответом, но хочу добавить еще вариант. Можно создать отдельный JS-файл с функциями для разных сценариев. В ответе от сервера передавать имя функции, которую нужно выполнить. А на клиенте вызывать ее динамически. Так код будет более гибким и расширяемым. Что думаешь насчет такого подхода?