#javascript #c# #asp.net-core #razor-pages
Вопрос:
Я хочу выполнять фрагмент кода C# всякий раз, когда я запускаю функцию JavaScript, но, похоже, он ведет себя не так, как я хочу. Вот пример:
Допустим, у меня есть переменная property int Counter {get; set; }
в модели, которую я хочу увеличивать каждый раз, когда я запускаю функцию JavaScript:
<script type="text/javascript">
function MyFunction(){
//Do some stuff
@{Model.Counter ;}
}
</script>
На самом деле происходит то, что при загрузке страницы @{Model.Counter ;}
выполняется независимо от того, вызывается ли она не из функции.
И всякий раз, когда я снова запускаю функцию, она полностью игнорирует ее.
Это означает, что этот фрагмент кода @{Model.Counter ;}
выполняется один раз при загрузке страницы и никогда больше.
Как это исправить и заставить его выполняться каждый раз, когда я запускаю функцию?
Комментарии:
1. JavaScript = Клиент, C# = Сервер
2. Razor-это не какой-то способ смешивать серверный C# с клиентским javascript. Вместо этого он использует серверную часть C# для создания html( js), который будет отправлен в браузер. Если вы проверите свою страницу в браузере, вы не увидите никакого C# (там будет функция myFunction, но она будет пустой).
3. Если вы не слишком углубились в свой проект, вы могли бы намного приблизиться к тому, что вы пытаетесь сделать с Blazor, который действительно запускает c# (вроде…) в браузере. Шаблон по умолчанию даже поставляется со встречным примером.
4. Хорошо, я думаю, что понял, вы правы, на стороне клиента нет кода C#. Я все еще новичок в ASP.NET, извините за очевидную ошибку и спасибо за ваш ответ.
5. @Crowcoder Я делаю проект для своего университета, и мой доктор хочет, чтобы мы придерживались C#, Javascript, CSS, HTML. 🙁 Но, возможно, я взгляну на это в будущих целях, спасибо.
Ответ №1:
Вы можете использовать элемент управления ActiveX для выполнения скомпилированной программы. но вы должны знать, что ваш html-код будет работать только в IE.
Ответ №2:
Вам нужно будет создать скрытое поле для model.counter где-нибудь внутри формы представления
<input type="hidden" id="modelCounter" asp-for="Counter" value="@Model.Counter" />
после этого вы можете изменить счетчик с помощью javascript
function MyFunction(){
//Do some stuff
var counter=$("#modelCounter").val();
counter ;
$("#modelCounter").val(counter);
}
Ответ №3:
Я не думаю, что то, чего вы хотите, возможно (может быть, с Блейзором? — но это веб-сборка). Вместо этого вы можете назначить новую переменную javascript свойству модели. Например.:
<script type="text/javascript">
function MyFunction(){
//Do some stuff
let counter = @{Model.Counter};
counter ;
// Do some stuff with counter
}
// When you are done, post the counter back if needed on server side
</script>
Комментарии:
1. Мой плохой, очевидно, вам нужно увеличить переменную javascript. Я отредактировал свой ответ.
Ответ №4:
Попробуйте Это
@{
var a=Model.Counter;
}
сделайте это вне сценария
и внутри функции или скрипта сделайте
@a ;
или
var c = @a;
c ;
надеюсь, это сработает