1

我正在编写的一个小应用程序有问题。现在要么我的错误出现在我的控制器类中,要么出现在 Routes 中。请参阅下面的图片。

控制器类。

这是我要执行的控制器

这是我拥有的默认路线。

路由配置文件

这是我运行时遇到的错误。图片不是很清楚,但上面写着:

参数字典包含“GlobalUnited.WebUI.Controllers.PlayerController”中方法“System.Web.Mvc.ActionResult Detail(Int32)”的不可空类型“System.Int32”的参数“playerId”的空条目。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:参数

错误

我在这里阅读了一些帖子,特别是: 类似链接

当 Daniel Renshaw 说:

首先,我建议您使用 MVC 对参数的自动处理,而不是自己将它们从 Request 中提取出来。您的控制器操作有一个似乎被忽略的 id 参数 - 使用它并添加其他类似的参数来获取输入参数。

无论如何,在阅读了那篇文章后,我将 RouteConfig 文件更改为:

改变路线

我仍然得到这个错误。它说:

名为“DefaultApi”的路由已在路由集合中。路由名称必须是唯一的。参数名称:名称

路线

我什至尝试将我的 Detail 操作参数更改为:注意 int?宣言 方法

更改后出现此错误:

在此处输入图像描述

我可以做些什么来解决这个问题,不那么复杂的东西吗?所有帮助将不胜感激,谢谢。

4

3 回答 3

6

您的参数名称 playerID 会导致此处出现问题。ASP.NET MVC 只能使用默认路由为您提供名为 id 的参数。在您的情况下,它无法将请求映射到您的操作,因为 playerID 不可为空或可选。将参数名称更改为 id 将解决问题。

public ActionResult Detail(int id)

由于您已经有一个名为“DefaultApi”的路由,因此您会收到路由注册的第二个错误。如果您更改参数名称(也已在其他地方注册),则不需要此路由。

第三个错误是尝试使用空值进行查询。ASP.NET MVC 无法将 URL 中的值映射到您的参数,并且您获得默认值 null。由于没有具有空值的行,您会得到一个空序列,因此 Single() 方法会引发异常。

于 2012-10-07T20:38:14.277 回答
1

当您的参数被调用playerId时,您必须将其作为路由值传递给Detail操作方法,然后检查它是否为空。这将解决您在问题中显示的最后一个错误:Sequence contains no element

在 action 方法中执行此操作:

public ActionResult Detail(int? playerId)
{
   if(playerId.HasValue)
   {
       var model = _dataSource.Players.Single(p => p.PlayerId == playerId);

       return View(model);
   }

   // Handle the other possibility where playerId is NULL
}

要让 ASP.NET MVC 知道如何进行正确的参数绑定,您必须以这种方式调用上述操作方法,例如:

@Html.ActionLink("Player Details", "Detail", new { playerId = 1 }); 
于 2012-10-07T20:43:10.403 回答
1

除了重复路由错误之外,您的错误与 DefaultApi 路由无关。您会得到一个重复的路由,因为该路由是在 App_Start\WebApiConfig.cs 中配置的

您的第一个问题是您告诉 MVC 您有一个名为 playerId 的强制性 Route 参数,但您没有在您使用的 URL 中提供此路由参数。为了使其工作,您需要更改路线以将 id 更改为 playerId,或将 playerId 查询字符串参数添加到您的 url。如果您更改路线,则需要一个类似http://my.site/Player/Detail/1(如果您更改路线)或http://my.site/Player/Detail?playerId=1.

另一种选择是更改参数,public ActionResult Detail(int id)然后将使用现有的默认路由,该路由采用一个名为 id 的参数,并从以/1.

您也可以使用该方法Detail(int? id),但是您需要在您的 linq 查询周围放置一个空保护(因为如果您没有在 URL 上传递 ID,它就无法查找空记录)所以您必须添加这个:

if (id.HasValue) {
    // execute linq query
}

或者,您可以将查询更改为 returnSingleOrDefault()而不是Single().

于 2012-10-07T21:10:15.270 回答