C# ValueProvider.GetValue给定异常

C# ValueProvider.GetValue给定异常,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我正在读迪诺·埃斯波西托的《微软ASP.NETMVC编程》第三版。我正在尝试运行下面的示例 public ActionResult Echo() { var data = ValueProvider.GetValue("data").AttemptedValue ?? (ValueProvider.GetValue("today").AttemptedValue ?? String.Empty); return View(); } 我添加

我正在读迪诺·埃斯波西托的《微软ASP.NETMVC编程》第三版。我正在尝试运行下面的示例

public ActionResult Echo()
    {
        var data = ValueProvider.GetValue("data").AttemptedValue ?? (ValueProvider.GetValue("today").AttemptedValue ?? String.Empty);    
        return View();
    }
我添加了如下路由配置:

routes.MapRoute(
            name: "EchoRoute",
            url: "echo/{data}",
            defaults: new {controller = "Home", action = "Echo", data = UrlParameter.Optional}
            );
现在,如果我尝试使用带有参数localhost/echo/myName的url,代码会正常工作,但如果我输入一个查询字符串localhost/echo?today=02/24/2016,我会得到如下异常:

routes.MapRoute(
            name: "EchoRoute",
            url: "echo/{data}",
            defaults: new {controller = "Home", action = "Echo", data = UrlParameter.Optional}
            );


不知道这里到底发生了什么

您已将
{data}
标记为可选。在示例URL
/echo?today=02/24/2016
中,您没有为
{data}
提供值。因此,
ValueProvider.GetValue(“数据”)
的值是
null
。在尝试调用
.AttemptedValue
之前,需要检查它是否为
null

由于查询字符串值也是可选的,因此今天您需要对
执行相同的操作

var data = ValueProvider.GetValue("data") != null ? 
    ValueProvider.GetValue("data").AttemptedValue : 
        (ValueProvider.GetValue("today") != null ?
        ValueProvider.GetValue("today").AttemptedValue : 
        String.Empty);

尽管如此,您可能会使用一些
if
语句来提高代码的可读性。

请不要将文本作为图像发布。将错误表复制(或手动写入)为文本。使用短路确保首先检查空对象:空条件运算符:?。这是。除非我个人更喜欢这种方式:var data=ValueProvider?.GetValue(“数据”)?.AttemptedValue??字符串。空;