Есть следующий контроллер:
public class SomeController: Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult SomeMethod()
{
return PartialView();
}
}
Метод Index возвращает такое представление:
@Scripts.Render("~/Scripts/jquery-3.3.1.js")
<div id = "place_for_some_content"></div>
<script type="text/javascript" src="~/Scripts/SomeScript.js"></script>
<script>someFunction();</script>
Функция someFunction() определена в файле ~/Scripts/SomeScript.js:
var someFunction = function() {
$.ajax({
type: "POST",
url: '@Url.Action("SomeMethod", "Some")',
data: {},
success: function (data) {
alert("some alert");
$('#place_for_some_content').html(data);
}
});
}
Проблема в том, что при таком подходе функция someFunction() даже не заходит в метод SomeMethod(), но при этом вываливается в состояние success (алерт отрабатывает), а в поле "place_for_some_content" помещается сообщение "Запрашиваемый ресурс не найден". Судя по всему, скрипт просто не видит контроллер?
Если поместить код функции непосредственно в представление, то все нормально отрабатывает, без ошибок, но захламлять текст представления не очень хочется, тем более когда несколько разных представлений должны использовать одну и ту же функцию, поддерживаемость такого решения оказывается на нуле.
Пожалуйста, подскажите, как правильно через ajax-запросы обращаться к методам контроллеров из отдельных js-файлов.
Область видимости для js файлов в вьюшном вебконфиге прописал.
Разобрался с помощью ответа отсюда
В двух словах, изменил вызов функции из срипта в представлении на:
<script>
var SomeUrlVar = {
URL: '@Url.ActionLink("SomeMethod", "Some")'
}
showTable(someUrlVar);
</script>
А скрипт SomeScript.js изменил следующим образом:
var someFunction = function(SomeUrl) {
$.ajax({
type: "POST",
url: SomeUrl.URL,
data: {},
success: function (data) {
alert("some alert");
$('#place_for_some_content').html(data);
}
});
}
Это решило проблему
Продвижение своими сайтами как стратегия роста и независимости