【问题标题】:Possible to have Guid as an optional parameter in asp.net mvc 3 controller action?可以将 Guid 作为 asp.net mvc 3 控制器操作中的可选参数吗?
【发布时间】:2011-03-01 20:28:15
【问题描述】:

我试图在控制器上进行索引操作,以选择像这样的 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)'在 'Controllers.SomeController'。 可选参数必须是 引用类型,可为空的类型,或者是 声明为可选参数

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 是有道理的,它确实解决了问题......为什么可选参数不起作用? mvc 是如何通过动作构造函数的吗?有什么提示吗?
    • 因为 MVC 框架会将 null 传递到您的操作中,以获取路由中找不到值的任何可选参数。它不只是调用没有该值的方法。它必须显式传递null。因为Guid 是值类型,所以不能将null 作为参数传递,即使参数具有默认值。
    • 实际上解释是错误的,因为 int 也是值类型,它也不能为空,但是带有 int 的可选参数在 MVC 控制器操作中工作得很好,而 Guid 可选参数不起作用( @andryuha 想要使用它的方式)。因此,将 id = UrlParameter.Optional 的 id 类型为 int 并设置为动作签名中的某个值将起作用,而与 Guid 相同的事情则不起作用。它显然与 Guid 类型有关,我猜也可能是 MVC 中的一个错误。
    • 这实际上是不正确的,母马。关于路由的可选意味着 Action 不需要在参数中接受(即您完全省略它)。如果您在方法签名中留下了int 参数,那么它将是必需的,并且您会遇到用户在上面遇到的相同问题。可选并不意味着可以为空。如果你有什么参数可以为空(如 OP 所示),那么你必须使用可以为空的类型。
    • 进一步澄清:您可以在操作中完全省略 id 参数,也可以使用可为空的类型。使用给定的路由,您不能使用常规的int,然后即使未提供值也期望执行您的操作。它会以与 OP 遇到的相同错误进行轰炸。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2013-01-16
    • 2018-11-04
    • 2011-07-25
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多