我想从模型中传递一个值...
@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);
}
答案 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
}