Код работает в CSHTML, но не работает во внешнем файле Javascript

Я пытаюсь переместить свой скрипт из CSHTML во внешний файл Javascript. Все скрипты работают отлично, кроме одной функции: $.post('@Url.Action("GetPoint", "Main")').done(function (xml)

Ошибка, которую я получаю в отладчике браузера:

jquery.min.js:2 POST http://localhost:58153/@Url.Action(%22GetPoint%22,%20%22Main%22) 404 (Not Found)

Как заставить работать эту функцию??

var script = document.createElement('script');
script.src = "https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js";
script.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(script);

var createPoint = function(ctx, lat, lon) {
  ctx.beginPath();
  ctx.arc(lat, lon, 8, 0, Math.PI * 2);
  ctx.fillStyle = "red";
  ctx.strokeStyle = "black";
  ctx.lineWidth = 3;
  ctx.fill();
  ctx.stroke();
  ctx.closePath();
}
var isFirstMission = document.getElementById("first").value;
var ctx = document.getElementById("myCanvas").getContext('2d');
ctx.canvas.width = window.innerWidth;
ctx.canvas.height = window.innerHeight;

if (isFirstMission) {
  // ...
} else {
  myTimer = (function(ctx) {

    $.post('@Url.Action("GetPoint", "Main")').done(function(xml) { // This function does not work..
      alert(xml);
      var xmlDoc = $.parseXML(xml);
      $xml = $(xmlDoc);
      var lat = (parseFloat($xml.find("lat").text()) + 90)(screen.height / 180);
      var lon = (parseFloat($xml.find("lon").text()) + 180) * (screen.height / 360);
      alert(lat);
      alert(lon);

      createPoint(ctx, lat, lon);
    });
  });

  setInterval(function() {
    myTimer(ctx);
  }, 1000);
}

Это не будет работать во внешнем файле JS, потому что вы используете синтаксис Razor: $.post('@Url.Action("GetPoint", "Main")'). Это интерпретируется только в файлах CSHTML

Rory McCrossan 29.05.2019 16:21

Кроме того, в стороне, вы действительно должны использовать логическое значение для isFirstMission, а не строку.

Rory McCrossan 29.05.2019 16:22

@RoryMcCrossan Должен сказать, это увлекательно if ("true" === isFirstMission) {

GrafiCode 29.05.2019 16:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
31
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема в том, что файл Javascript не анализируется на сервере как C#, поэтому строка '@Url.Action("GetPoint", "Main")' воспринимается буквально. Чтобы решить эту проблему, вы можете установить переменную в файле cshtml, чтобы она анализировалась, и использовать эту переменную в файле Javascript.

В файле cshtml...

<script>
    var postUrl = '@Url.Action("GetPoint", "Main")';
</script>

Затем включите свой файл Javascript ниже в это объявление и измените сообщение на это...

$.post(postUrl).done(// etc..
Ответ принят как подходящий

Серверный код C# (Razor) не интерпретируется в .js файлах. (И не должно быть, вы не хотите идти по этому пути.)

Вместо этого вы можете просто установить переменные JavaScript в своем коде, управляемом Razor (возможно, глобальные, в зависимости от того, как вы управляете областью действия в своем коде JavaScript) и использовать эти значения во внешнем JavaScript. Так что, возможно, что-то вроде этого в Razor:

<script type = "text/javascript">
    var getPointURL = '@Url.Action("GetPoint", "Main")';
</script>

И в другом месте вы можете использовать это значение:

$.post(getPointURL)

Существует множество способов управления/масштабирования/и т. д. этот подход, в зависимости от ваших растущих потребностей в вашей системе. Но в целом идея заключается в том, что все, что является динамическим из кода на стороне сервера, находится в файле Razor, а затем JavaScript страницы будет использовать его позже.

Другие вопросы по теме