在ASP.Net MVC中使用System.Guid作为主键?

10

我在数据库中创建了一个具有 System.Guid 作为主键的表。已生成所需的 ADO.Net Entity Framework 模型并映射了必需的存储过程。

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

参数字典包含非可空类型 'System.Guid' 的参数 '[MyId]' 的空条目,用于 '[MySite] [MyController] [SpecificController]' 中的 'System.Web.Mvc.ActionResult Edit(System.Guid)' 方法。要使参数可选,其类型应为引用类型或可为空类型。 参数名称:parameters

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

public ActionResult Edit(Guid itemId)
{
    return View();
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(MyItem itemToModify)
{

}

在添加新记录时,通过存储过程生成了新的Guid,并且列表显示了正确的Guid。 URL也传递了正确的Guid以进行检索。

我似乎无法捕获此失败点,但是我该如何将System.Guid作为参数传递给控制器?

2个回答

18

除非您更新了路由,否则它默认期望路由的最后一个参数被命名为“id”。也就是说,如果您有一个路由像 /specific/edit/5646-0767-...,它将把guid映射到路由值字典中的键“id”,无论方法参数的名称是什么。我建议遵循这个约定并将方法定义更改为:

public ActionResult Edit(Guid id)

你可以通过显式指定路由参数的名称来解决这个问题,但是这样最终得到的 URL 看起来像这样:/specific/edit?itemid=5646-0767-...


别担心,我知道答案的唯一原因是我曾经也做了同样的事情并且不得不自己想办法解决。 - tvanfosson

4
以下是示例代码,供需要的人使用(我肯定需要)。
        public ActionResult Profile(Guid? id)
    {
        if (!id.HasValue)
        {
            return View(new ProfileRepository().GetUserProfile(User.Identity.Name));
        }

        return View(new ProfileRepository().GetUserProfile(id.Value));

    }

感谢您上面的答案,它让我朝着正确的方向前进。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接