代码之家  ›  专栏  ›  技术社区  ›  BinaryMisfit

在ASP.NET MVC中使用System.guid作为主键?

  •  7
  • BinaryMisfit  · 技术社区  · 15 年前

    我在数据库中创建了一个以System.guid作为主键的表。所需的ADO.NET实体框架模型已生成,所需的存储过程已映射。

    我创建了一个新的控制器,并添加了创建和编辑数据所需的基本代码。但是,当单击链接编辑特定记录时,会生成以下错误:

    The parameters dictionary contains a null entry for parameter '[MyId]' of non-nullable type 'System.Guid' for method 'System.Web.Mvc.ActionResult Edit(System.Guid)' in '[MySite].[MyController].[SpecificController]'. To make a parameter optional its type should be either a reference type or a Nullable type. Parameter name: parameters

    编辑操作在控制器中声明如下:

    public ActionResult Edit(Guid itemId)
    {
        return View();
    }
    
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(MyItem itemToModify)
    {
    
    }
    

    添加新记录时,通过存储过程生成新的guid,并且列表显示正确的guid。该URL还传递了正确的用于检索的GUID。

    我似乎无法捕获失败的点,但如何将system.guid作为参数传递给控制器呢?

    2 回复  |  直到 11 年前
        1
  •  17
  •   tvanfosson    15 年前

    除非您已经更新了路由,否则(默认情况下)路由中的最后一个参数将被命名为“id”。也就是说,如果您有一个类似/specific/edit/5646-0767-…,它将把guid映射到路由值字典中,键为“id”,而不管方法上的参数是什么名称。我将遵循此约定,并将方法定义更改为:

    public ActionResult Edit(Guid id)
    

    您可以通过显式地指定路由参数的名称来绕过这个问题,但最终得到的URL看起来像是/specific/edit?项目ID=5646-0767-…

        2
  •  4
  •   Geovani Martinez    13 年前

    为任何可能需要它的人提供下面的示例代码(我当然有)

            public ActionResult Profile(Guid? id)
        {
            if (!id.HasValue)
            {
                return View(new ProfileRepository().GetUserProfile(User.Identity.Name));
            }
    
            return View(new ProfileRepository().GetUserProfile(id.Value));
    
        }
    

    谢谢你在上面引导我朝着正确的方向前进。