Я пытаюсь переместить свой скрипт из 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 (не найден)

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

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);
}
0
Almog Levi 29 Май 2019 в 17:19

2 ответа

Лучший ответ

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

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

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

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

$.post(getPointURL)

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

1
David 29 Май 2019 в 14:24

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

В файле cshtml ...

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

Затем включите свой Javascript-файл ниже в эту декларацию и измените запись на эту ...

$.post(postUrl).done(// etc..
1
Reinstate Monica Cellio 29 Май 2019 в 14:24