【问题标题】:"Parameters dictionary contains null for parameter of non-nullable type"?“参数字典包含非可空类型参数的空值”?
【发布时间】:2012-04-25 09:02:12
【问题描述】:

我在运行时收到 id 的空错误。这是我所有的部分。

这是我的 DAL,ProjectDB

 public static List<Product> IsOrganic(int lotid)
    {
        using (var db = new ProductDB())
        {   //Selects from database in SQL what we need
            //IsDamaged is Organic, and bool for true/false for food
            DbCommand cmd = db.GetSqlStringCommand("SELECT * FROM PRODUCTS WHERE ORGANIC = 1");


            return FillList(db.ExecuteDataSet(cmd));
        }
    }

这是我的经理

public List<Product> IsOrganic(int lotid)
    {


        return ProductDB.IsOrganic(lotid);


    }

这是我的控制器

 public ActionResult Organic(int id)//Store/Organic
    {
        ProductManager mgr = new ProductManager();

        var list = mgr.IsOrganic(id);

        return View(list);
    }

另外,这里是我的全局

  public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

【问题讨论】:

  • 如果你没有传入参数,你会得到那个错误。
  • 该错误准确地描述了问题所在。您的请求和路由设置是什么样的?
  • 当框架尝试调用您的控制器方法时,该错误发生在更高级别。执行未到达您显示的代码。
  • a: 你的路由大概没有将id 传递到操作中,b: 你没有在方法中使用id,那么它为什么存在呢?
  • 路线信息会在我的全局文件中吗?

标签: c# asp.net-mvc


【解决方案1】:

如果您使用的是 C# 4,请使用可选参数的默认值

public ActionResult Organic(int id = 0)//Store/Organic
{
    ProductManager mgr = new ProductManager();

    var list = mgr.IsOrganic(id);

    return View(list);
}

如果仅限 C# 3,则使用 DefaultValue 属性作为可选参数

public ActionResult Organic(
      [System.ComponentModel.DefaultValue(0)] int id) //Store/Organic
{
    ProductManager mgr = new ProductManager();

    var list = mgr.IsOrganic(id);

    return View(list);
}

但我想知道你为什么这样调用 Organic 方法,即没有参数。

如果您想测试 StoreController 的 Organic 操作是否有效,请在 url 中输入:

http://localhost/Store/Organic/7

或者这个:

http://localhost/Store/Organic?id=7

如果您为 StoreController 的 Organic 操作的参数 id 使用自定义名称,请说 organicId:

public ActionResult Organic(int organicId = 0) //Store/Organic?organicId=7
{
    ProductManager mgr = new ProductManager();

    var list = mgr.IsOrganic(id);

    return View(list);
}

,此网址无效:http://localhost/Store/Organic/7

,不会有运行时错误,但organicId值不会被传递值,因此总是有一个值0

,你必须改用这个:http://localhost/Store/Organic?organicId=7

顺便问一下,运行时错误从何而来?点击链接后?尝试将鼠标悬停在该链接上并查看浏览器的状态栏,您的 URL 必须符合此:http://localhost/Store/Organic/7 或此http://localhost/Store/Organic?id=7

如果看起来不是这样,请将您的 ActionLink 更改为:

@Html.ActionLink("Store", "Organic", new {id = 7})

或者如果您使用的是纯 HTML:

<a href="Store/Organic/7">

或者这个:

<a href="Store/Organic?id=7">

【讨论】:

  • 感谢您的回复。我做了一些事情,我可能已经修复了那个 id 错误。我现在在运行它时遇到此错误,执行 /store/organic 尝试为文件 C:\Users\MYNAE.UNI\Dropbox\WebDev2\Project (Final)\NewProj3\NewProj3\App_Data 附加一个自动命名的数据库\StoreDB.sdf 失败。存在同名数据库,或无法打开指定文件,或位于 UNC 共享上。这是在我的 AbstractDatabase.cs
  • 但是数据库文件在那个位置,我加倍检查=\
  • “感谢您的回复。我做了一些事情,我可能修复了那个 id 错误。”ツ 不应该是reproducible的问题,这样遇到同样的错误应该知道怎么解决了吧?您可以在单独的问题上发布您的数据库问题,它也可能有更高的机会在serverfault.comdba.stackexchange.com 的两个姐妹站点stackoverflow.com 中得到解决
  • 在没有参数的情况下以这种方式调用它是用户可能会做的事情,至少这就是为什么我想要一个针对这种情况的自定义错误页面。我可以在 Execute 方法中检查该错误(如果 id == null .. 一些错误处理)还是在使用错误/缺少参数调用函数时立即停止程序?
猜你喜欢
  • 2012-07-26
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多