Html.HiddenFor帮助器抛出null异常

时间:2017-05-13 15:47:14

标签: asp.net-mvc asp.net-mvc-5

我想从模型中传递一个值...

@Html.HiddenFor(model => model.ProductId)
  

抛出异常:System.Web.Mvc.dll中的“System.ArgumentException”

     

附加信息:值不能为空或空。

但它抛出了这个异常,我不知道为什么......并且没有ProductId不为空。

动作

   [HttpGet]
    public ActionResult Edit(int ProductId = 0)
    {
        PCsViewModel pcViewModel = new PCsViewModel();
        ProductRepository productRepo = new ProductRepository();
        Product dbProduct = productRepo.GetAll(item=>item.ID==ProductId);
        PCsRepository pcsRepo = new PCsRepository();
        PC dbPC = pcsRepo.GetAll(item=>item.ProductID==ProductId);
        if (dbProduct != null && dbPC != null)
        {
            pcViewModel = new PCsViewModel(dbProduct,dbPC);
        }
        return View(pcViewModel);
    }

视图模型

public int ProductId { get; set; }
        [Required]
        public string Name { get; set; }
        public string PCsInfo { get; set; }//for the front view
        [Required]
        public double Price { get; set; }
        [Required]
        public string ImagePath { get; set; }
        [Required]
        public string Processor { get; set; }
        [Required]
        public string OS { get; set; }
        [Required]
        public int RAM { get; set; }
        [Required]
        public int Storage { get; set; }
        [Required]
        public string VideoCard { get; set; }
        [Required]
        public int CategoryID { get; set; }
        public PCsViewModel()
        {

        }

        public PCsViewModel(Product product, PC pc)
        {
            this.ProductId = product.ID;
            this.CategoryID = product.CategoryID;
            this.OS = product.OS;
            this.Processor = product.Processor;
            this.Name = product.Name;
            this.RAM = product.RAM;
            this.Storage = product.Storage;
            this.VideoCard = pc.VideoCard;
            this.PCsInfo = "PC "+product.Name + "with processor " + product.Processor;
            this.Price = (double)product.Price;
            this.ImagePath = Path.Combine(Constants.ImagesPCsDirectory, product.ImageName);
        }

1 个答案:

答案 0 :(得分:1)

根据评论中的讨论,您的实际问题看起来与ProductId属性无关,而是您的ImagePath属性,该属性已被传递到Url.Content()帮助(解决适当的路径)。

如果路径存在,这将按预期工作,但如果该属性为null或为空,则会收到您当前所在的ArgumentNullException。最好的方法可能只是呈现特定路径 if 特定属性不为null:

@if (!string.IsNullOrEmpty(Model.ImagePath)) {
    // Use Url.Content(Model.ImagePath) within here safely
}

有多种不同的方法可以解决这个问题,例如在模型上添加一个额外的属性来清理:

public bool HasImage => !string.IsNullOrEmpty(ImagePath);

然后使用:

@if (Model.HasImage) {
    // Use Url.Content(Model.ImagePath) within here safely
}