C# 是否可以将Guid作为asp.net mvc 3控制器操作中的可选参数?
我试图在控制器上执行索引操作,以选择性地采用guid,如下所示: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
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
}
}