Javascript 如果MVC模型属性为';使用Jquery返回null

Javascript 如果MVC模型属性为';使用Jquery返回null,javascript,jquery,asp.net-mvc,Javascript,Jquery,Asp.net Mvc,好的,我已经找了一些问题的答案,但似乎被接受的答案对一些人有效,但对我来说不是 下面是我当前检查@Model.ListImages是否为非null var img = @((Model != null && Model.ListImages != null).ToString().ToLower()); if (img) { if (@Model.ListImages.Count() + this.files.length > 8) { this.r

好的,我已经找了一些问题的答案,但似乎被接受的答案对一些人有效,但对我来说不是

下面是我当前检查
@Model.ListImages
是否为
非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; }

}
公共类ProductVM
{
[必需]
公共int Id{get;set;}
[必需]
[显示(Name=“Category”)]
public int IdCategory{get;set;}
[必需]
[显示(Name=“集合”)]
公共int IdCollection{get;set;}
[必需]
[范围(0.12000,ErrorMessage=“请输入一个介于0和20000之间的值”)]
公共十进制价格{get;set;}
[必需]
[显示(名称=“产品名称”)]
[StringLength(100,ErrorMessage=“产品名称必须至少包含{2}个字符”,MinimumLength=6)]
公共字符串名称{get;set;}
[必需]
[显示(名称=“产品说明”)]
[StringLength(500,ErrorMessage=“产品名称必须至少包含{2}个字符”,MinimumLength=25)]
公共字符串说明{get;set;}
公共HttpPostedFileBase[]列表文件{get;set;}
公共虚拟IEnumerable类别{get;set;}
公共虚拟IEnumerable集合{get;set;}
公共虚拟IEnumerable ListReviews{get;set;}
公共虚拟ICollection ListImages{get;set;}
}
JavaScript有一种棘手的(如果您不知道的话)方法来检查truthy和falsy值的条件。当您像以前那样直接在条件中检查变量时

if (img)
它实际上并不检查您提供的变量值是假还是真,而是检查该对象是否存在。因此,即使
img
为false,您的代码也会转到那里,您将得到
null引用
异常

尝试一个简单的方法

if (img != false)
但是,正如另一个答案所建议的

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

更好

问题是您将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>
}

你的问题是什么?你给出了什么错误?@DavideVitali我的代码中没有错误,它只是进入了if中,我确实得到了错误,特别是
@Model.ListImages.Count
-这将引发异常
值不能为null
这应该是带有剃刀插入值的JavaScript代码吗?如果
//某些代码
抛出异常,您需要与我们共享该异常以及您的模型的定义。@Jasen我不知道这有什么帮助,但确定您是否尝试过“img”=假的?,真的吗?如果列表或对象为空,如何访问Count()属性?不建议使用仅代码的答案。请添加一些解释,说明这是如何解决问题的,或者这与现有答案有何不同。我刚告诉过你可以做到。你想干什么就干什么。如果model为null,那么首先检查它,然后你就可以这样做了。实际上,这行代码给出了异常
@model.ImagesList.Count()
,这就是为什么我试图不通过这行代码…@GabrielCostin对,我忘了检查model。Edited.Davide@Model不为空,但属性
ListImages
为空null@GabrielCostin现在应该很清楚,要检查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>
}
<div id="image"
     data-count="@((Model != null && Model.ListImages != null) ? Model.ListImages.Count : 0)">
</div>
var count = $("#image").data("count");
if  (count > 0) {
    removeFile();
}