可以将Guid作为asp.net mvc 3控制器动作中的可选参数吗?

时间:2011-03-01 20:28:15

标签: c# c#-4.0 asp.net-mvc-3 optional-parameters

我试图在控制器上进行索引操作,以选择性地使用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   引用类型,可空类型或者是   声明为可选参数

这是不可能的吗?我错过了什么?感谢

1 个答案:

答案 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
    }
}