我读了Freeman的书“ASP.NET MVC5”,我尝试在我的网站上添加管理页面。现在当我转到页面 http://localhost:63843/Admin/Edit 时,我有错误:
参数字典包含一个带有NULL值的条目,参数“productId”类型为“System.Int32”,不允许值为NULL,“System.Web.Mvc.ViewResult Edit(Int32)的方法)“in”SportsStore.WebUI.Controllers.AdminController“。可选参数必须是引用类型,类型,允许值为NULL,或者必须将其声明为选项。 参数名称:参数
public class AdminController : Controller
{
private IProductRepository repository;
public AdminController(IProductRepository repo) {
repository = repo;
}
public ViewResult Edit(int productId) {
Product product = repository.Products
.FirstOrDefault(p => p.ProductID == productId);
return View(product);
}
}
但是这里是对Edit的所有引用,并且没有任何NULL值:
Product p1 = target.Edit(1).ViewData.Model as Product;
Product p2 = target.Edit(2).ViewData.Model as Product;
Product p3 = target.Edit(3).ViewData.Model as Product;
Product result = (Product)target.Edit(4).ViewData.Model;
当我发表评论时,没有任何变化。 我无法理解,NULL值在哪里。
答案 0 :(得分:2)
您的操作需要一个int
的参数而您没有传递它。如果您放入浏览器 /编辑?ProductId = 1` 它将起作用,或使动作参数为null能。
public ViewResult Edit(int? ProductId)
现在它不会抛出错误。
答案 1 :(得分:2)
问题在于方法声明:
public ViewResult Edit(int productId)
您期望productId,但不会传递它:http://localhost:63843/Admin/Edit。网址应为:http://localhost:63843/Admin/Edit/1
答案 2 :(得分:1)
当您访问 http://localhost:63843/Admin/Edit 而未指定productId
时,空值来自 http://localhost:63843/Admin/Edit?productId=1 。
您可以将productId
设为可选的
public ViewResult Edit(int? productId)
{
...
}
成为可选项
{{1}}
答案 3 :(得分:1)
在你的行
public ViewResult Edit(int productId) {
您将参数productId
定义为int
。该消息只告诉它必须是可以为空的参数或可选参数。所以只要把它变成
// nullable
public ViewResult Edit(int? productId) { ... }
或
// optional
public ViewResult Edit(int productId = -1) { ... }
所以Edit
的任何来电都会接受来电null
- 无论是否会发生这种情况。
如何使参数成为int? ans在函数内部设置一个断点来分析stacktrace / callhirarchy以找出谁尝试了null调用..?