C# 是否可以将Guid作为asp.net mvc 3控制器操作中的可选参数?

C# 是否可以将Guid作为asp.net mvc 3控制器操作中的可选参数?,c#,c#-4.0,asp.net-mvc-3,optional-parameters,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

我试图在控制器上执行索引操作,以选择性地采用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”的空项 的不可为空的类型“System.Guid” 方法“System.Web.Mvc.ActionResult” 中的索引(System.Guid)' “控制器。SomeController”。 可选参数必须是 引用类型、可为Null的类型或be 声明为可选参数


难道这不可能吗?我错过了什么?谢谢

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

Guid myGuid = null;  // invalid
然而,在C#2中,添加了一些语法糖,使值类型可以为null(通过将它们包装在可为null的对象中),如下所示:

Guid? myGuid = null; // valid.  myGuid will be Nullable<Guid>.

这是有道理的,而且它确实解决了问题……但是为什么可选参数不起作用呢?mvc是如何通过动作构造函数的?有什么提示吗?因为MVC框架会将路由中找不到值的任何可选参数的
null
传递到您的操作中。它不只是调用没有该值的方法。它必须显式传递
null
。由于
Guid
是一种值类型,因此即使参数具有默认值,也不能将
null
作为参数传递。实际上,解释是错误的,因为int也是值类型,它也不能为null,但在MVC控制器操作中,int可选参数可以正常工作,而Guid可选参数不起作用(以@andryuha想要的方式使用)因此,使用id=urlparmeter.Optional将id类型设置为int并在操作签名中设置为某个值将起作用,而使用Guid则不起作用。很明显,它只与Guid类型有关,我猜这也可能是MVC中的一个错误。这实际上是不正确的,mare。对于路由,Optional意味着n不需要接受参数(即完全忽略它)。如果在方法签名中保留
int
参数,那么它将是必需的,并且您将遇到与用户遇到的问题相同的问题。可选并不意味着可以为null。如果您指定一个参数可以为null(如OP所示)然后,您必须使用可为空的类型。为了进一步澄清:您可以从操作中完全忽略id参数,或者您可以使用可为空的类型。对于给定的路由,您不能使用常规的
int
,然后即使没有提供值,也希望命中您的操作。这将导致OP遇到相同的错误。
routes.MapRoute(
    "Default", "{controller}/{action}/{id}",
    new { controller = "somecontroller",
        action = "Index",
        id = UrlParameter.Optional // <-- Optional!!
    });
public ActionResult Index(Guid? id) {
    if (id.HasValue) {
        // it's not null, so I can call "id.Value" to get the Guid
    }
}