Проблема в том, что вы смешиваете JavaScript и Razor, чего следует избегать. Это можно сделать, если сделать осторожно , но это приводит к трудностям при чтении, т. Е. К трудностям отладки и поддержки.
Ваш код предполагает, что Razor не будет выполняться на основе оценки JavaScript. Однако это не так, и оператор Razor всегда будет пытаться выполнить оценку.
// this looks like JavaScript with in-lined Razor.
// The Razor is executed before this JavaScript is executed.
var img = @((Model != null && Model.ListImages != null).ToString().ToLower());
// this is a JavaScript conditional based on a run-time value
if (img) {
// @Model.ListImages.Count() is evaluated by Razor BEFORE
// (and in a different context) the if(img) above.
// But there isn't a Razor condition preventing the execution of .Count()
// if ListImages is not initialized.
if (@Model.ListImages.Count() + this.files.length > 8) {
this.removeFile(file);
}
}
Так что вам нужен условный Razor для вывода другого кода JavaScript.
@* Razor evaluated on the server while rendering the view *@
@if (Model != null && Model.ListImages != null)
{
var count = Model.ListImages.Count;
<script>
// JavaScript evaluated in the client
var images = @count; // "hardcoded" count on the server
if (images > 0)
{
removeFile()
}
</script>
}
Более чистый способ избежать смешивания - это кодировать значение Razor в элемент HTML.
<div id="image"
data-count="@((Model != null && Model.ListImages != null) ? Model.ListImages.Count : 0)">
</div>
Затем получите значение в JavaScript, которое может работать без динамического вывода другого js-кода.
var count = $("#image").data("count");
if (count > 0) {
removeFile();
}