c# - 可以将 Guid 作为 asp.net mvc 3 Controller 操作中的可选参数吗?

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

我试图在 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”会出现以下错误...

The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Guid' for method 'System.Web.Mvc.ActionResult Index(System.Guid)' in 'Controllers.SomeController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter

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

最佳答案

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

Guid myGuid = null;  // invalid

但是,在 C# 2 中,添加了一些语法糖以使值类型可以为 null(通过将它们包装在 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 它应该可以工作。之后,您可以检查该值以确保它不为 null,如下所示:

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

关于c# - 可以将 Guid 作为 asp.net mvc 3 Controller 操作中的可选参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5159952/

相关文章:

css - mvc3 razor,Helper 中的 CSS

c# - 新的 netstandardapp 和 netcoreapp TFM 之间有什么区别?

c# - 如何将月份名称(字符串)解析为整数以便在 C# 中进行比较?

c# - 在 C# 中定义有界泛型类型参数

c# - 我可以在属性内使用 C# 锁定运算符来同步对变量的读/写访问吗?

json - 未找到端点 WCF

c# - MVC Entity Framework 将一列作为数组

c# - 服务层是否充当 DAL 的外观?

c#-4.0 - 如何在 C# 中使用 CODEDOM 生成空的 get & set 语句

asp.net-mvc-3 - 在 Action 过滤器中获取 Action 参数的值