" System.Int32"的NULL值

时间:2015-01-28 15:50:38

标签: c# asp.net-mvc asp.net-mvc-4

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

4 个答案:

答案 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调用..?