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