我试图在控制器上进行索引操作,以选择性地使用guid:
public ActionResult Index(Guid id = default(Guid))
或者像这样
public ActionResult Index(Guid id = new Guid())
我希望利用C#的可选参数,我的路由也定义了可选参数:
routes.MapRoute(
"Default", "{controller}/{action}/{id}",
new { controller = "somecontroller", action = "Index", id = UrlParameter.Optional }
但是调用“somecontroller / index”会出现以下错误......
参数字典包含一个 参数'id'的null条目 非可空类型'System.Guid' 方法'System.Web.Mvc.ActionResult 索引(System.Guid)' 'Controllers.SomeController'。 可选参数必须是a 引用类型,可空类型或者是 声明为可选参数
这是不可能的吗?我错过了什么?感谢
答案 0 :(得分:30)
Guid不可为空。例如,你不能这样做
Guid myGuid = null; // invalid
然而,在C#2中,添加了一些语法糖以使值类型可以为空(通过将它们包装在Nullable对象中),如下所示:
Guid? myGuid = null; // valid. myGuid will be Nullable<Guid>.
鉴于这条规则,让我们来看看你的路线:
routes.MapRoute(
"Default", "{controller}/{action}/{id}",
new { controller = "somecontroller",
action = "Index",
id = UrlParameter.Optional // <-- Optional!!
});
由于您在路线中指定id
参数是可选的,因此您必须使用可以null
,或的类型,您必须完全省略参数行动。因此,要修复您的操作,您需要将Guid id
参数更改为Guid? id
,它应该可以正常工作。之后,您可以检查该值以确保它不是如此:
public ActionResult Index(Guid? id) {
if (id.HasValue) {
// it's not null, so I can call "id.Value" to get the Guid
}
}