"System.Int32" 的 NULL 值

NULL value for "System.Int32"

我读了 Freeman 的书 "ASP.NET MVC5",并尝试将管理页面添加到我的站点。现在,当我转到页面 http://localhost:63843/Admin/Edit 时,出现错误:

参数字典包含一个条目,参数 "productId" 类型 "System.Int32" 的值为 NULL,不允许值为 NULL,"System.Web.Mvc.ViewResult Edit (Int32)" 的方法在 "SportsStore.WebUI.Controllers.AdminController"。一个可选参数必须是一个引用类型,类型,允许值为NULL,或者它必须被声明为一个选项。 参数名称:parameters

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值在哪里。

您的操作需要一个参数 int 而您没有传递 it.if 您在浏览器中输入 /Edit?ProductId=1` 它会工作,或使操作参数可为空。

public ViewResult Edit(int? ProductId)

现在不会抛出错误了。

空值来自于访问http://localhost:63843/Admin/Edit without specifying the productId, as in http://localhost:63843/Admin/Edit?productId=1.

您可以通过使 productId 为空来使其成为可选的:

public ViewResult Edit(int? productId) 
{
   ...
}

问题出在方法声明中:

public ViewResult Edit(int productId)

您需要 productId,但没有传递它:http://localhost:63843/Admin/Edit. URL should be: http://localhost:63843/Admin/Edit/1

在你的行中

public ViewResult Edit(int productId) {

您将参数 productId 定义为 int。该消息仅说明 this 必须是可为 null 的参数或可选参数。所以要么把它改成

// nullable
public ViewResult Edit(int? productId) { ... }

// optional
public ViewResult Edit(int productId = -1) { ... }

所以 Edit 的任何调用都将接受传入的 null - 不管这是否会发生。


将参数设为整型怎么样? ans 在函数内设置一个断点来分析stacktrace/ callhirarchy 找出谁尝试了null-call ..?