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

and*_*uha 17 c# optional-parameters c#-4.0 asp.net-mvc-3

我试图在控制器上进行索引操作以选择性地采用这样的guid:

public ActionResult Index(Guid id = default(Guid))
Run Code Online (Sandbox Code Playgroud)

或者像这样

public ActionResult Index(Guid id = new Guid())
Run Code Online (Sandbox Code Playgroud)

我希望利用C#的可选参数,我的路由也定义了可选参数:

routes.MapRoute(
    "Default", "{controller}/{action}/{id}",
     new { controller = "somecontroller", action = "Index", id = UrlParameter.Optional }
Run Code Online (Sandbox Code Playgroud)

但调用"somecontroller/index"会出现以下错误...

参数字典包含'Controllers.SomeController'中方法'System.Web.Mvc.ActionResult Index(System.Guid)'的非可空类型'System.Guid'的参数'id'的空条目.可选参数必须是引用类型,可空类型,或者声明为可选参数

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

Sco*_*son 30

Guid不可为空.例如,你不能这样做

Guid myGuid = null;  // invalid
Run Code Online (Sandbox Code Playgroud)

但是,在C#2中,添加了一些语法糖以使值类型可以为空(通过将它们包装在Nullable对象中),如下所示:

Guid? myGuid = null; // valid.  myGuid will be Nullable<Guid>.
Run Code Online (Sandbox Code Playgroud)

鉴于这条规则,让我们来看看你的路线:

routes.MapRoute(
    "Default", "{controller}/{action}/{id}",
    new { controller = "somecontroller",
        action = "Index",
        id = UrlParameter.Optional // <-- Optional!!
    });
Run Code Online (Sandbox Code Playgroud)

由于您在路由中指定id参数是可选的,因此必须使用可以是的类型null,或者必须在操​​作中完全省略该参数.因此,要修复您的操作,您需要更改Guid id参数Guid? id,它应该工作.之后,您可以检查该值以确保它不是null,如下所示:

public ActionResult Index(Guid? id) {
    if (id.HasValue) {
        // it's not null, so I can call "id.Value" to get the Guid
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 因为MVC框架会将"null"传递给您无法找到值的路径中任何可选参数的操作.它不只是在没有该值的情况下调用您的方法.它必须显式传递`null`.因为`Guid`是值类型,所以即使参数具有默认值,也不能传递`null`作为参数. (3认同)