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();
}