Проверьте свойство модели MVC, если оно пустое, используя Jquery - PullRequest
0 голосов
/ 16 марта 2019

Хорошо, я некоторое время искал ответы на свой вопрос, но кажется, что принятые ответы работают для некоторых, но для меня это не так.

Ниже моя текущая реализация, чтобы проверить, является ли @Model.ListImages not null

var img = @((Model != null && Model.ListImages != null).ToString().ToLower());
if (img) {
    if (@Model.ListImages.Count() + this.files.length > 8) {
        this.removeFile(file);
        $('#errorMessage').html("Cannot upload more then 8 images for a product.");
        $("#errorDiv").show();
        window.scrollTo(0, 0);
     }
}

Модель

public class ProductVM
{
    [Required]
    public int Id { get; set; }

    [Required]
    [Display(Name = "Category")]
    public int IdCategory { get; set; }

    [Required]
    [Display(Name = "Collection")]
    public int IdCollection { get; set; }

    [Required]
    [Range(0.1, 20000, ErrorMessage = "Please enter a value between 0 and 20000")]
    public decimal Price { get; set; }

    [Required]
    [Display(Name = "Product Name")]
    [StringLength(100, ErrorMessage = "Product name must contain at least {2} characters", MinimumLength = 6)]
    public string Name { get; set; }

    [Required]
    [Display(Name = "Product Description")]
    [StringLength(500, ErrorMessage = "Product name must contain at least {2} characters", MinimumLength = 25)]
    public string Description { get; set; }

    public HttpPostedFileBase[] Listfiles { get; set; }


    public virtual IEnumerable<SelectListItem> Categories { get; set; }
    public virtual IEnumerable<SelectListItem> Collections { get; set; }
    public virtual IEnumerable<Reviews> ListReviews { get; set; }
    public virtual ICollection<Images> ListImages { get; set; }

}

Ответы [ 3 ]

1 голос
/ 16 марта 2019

Проблема в том, что вы смешиваете 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();
}
0 голосов
/ 16 марта 2019

JavaScript имеет хитрый (если вы его не знаете) способ проверки условий для истинных и ложных значений.Когда вы проверяете переменную непосредственно в условии, как вы это делали

if (img)

, она фактически не проверяет, является ли значение предоставленной вами переменной ложным или истинным, но если этот объект существует .Таким образом, даже если img ложно, ваш код будет там, и вы получите исключение null reference.

Попробуйте простой

if (img != false)

, но, как предлагается в другом ответе,

if (@Model && @Model.ListImages && @Model.ListImages.Count() > 0)

лучше

0 голосов
/ 16 марта 2019
var length = "@(Model.ListImages.Count())";
if(length > 0){
   // do something
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...