这个错误在asp.net-mvc中表示什么?

时间:2010-05-01 06:24:23

标签: asp.net-mvc detailsview

我在asp.net mvc中有一个存储库类,有这个,

 public Material GetMaterial(int id)
    {
        return db.Materials.SingleOrDefault(m => m.Mat_id == id);
    }

我的控制器有详细的行动结果,

ConstructionRepository consRepository = new ConstructionRepository();
public ActionResult Details(int id)
    {
        Material material = consRepository.GetMaterial(id);
        return View();
    }

但为什么我会收到这个错误,

The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Details(Int32)' in 'CrMVC.Controllers.MaterialsController'. To make a parameter optional its type should be either a reference type or a Nullable type. Parameter name: parameters

任何建议......

2 个答案:

答案 0 :(得分:2)

您收到错误是因为您没有将id传递给控制器​​方法。

您基本上有两个选择:

  1. 始终将有效ID传递给控制器​​方法,或
  2. 使用int?参数,并在调用GetMaterial(id)之前合并null。
  3. 无论如何,您应该检查material的空值。所以:

    public ActionResult Details(int? id) 
    { 
        Material material = consRepository.GetMaterial((int)(id ?? 0)); 
        if (id == null)
            return View("NotFound");
        return View(); 
    }
    

    或(假设您总是传递正确的ID):

    public ActionResult Details(int id) 
    { 
        Material material = consRepository.GetMaterial(id); 
        if (id == null)
            return View("NotFound");
        return View(); 
    }
    

    要将有效的ID传递给控制器​​方法,您需要一个如下所示的路径:

     routes.MapRoute(
         "Default",
         "{controller}/{action}/{id}",
         new { controller = "Home", action = "Index", id="" }
     );
    

    一个看起来像这样的网址:

    http://MySite.com/MyController/GetMaterial/6  <-- id
    

答案 1 :(得分:0)

这意味着param(int id)传递了null,use(int?id)

(在控制器中)