0

错误

参数字典包含“sportingbiz.Controllers.PredictionController”中方法“System.Web.Mvc.ActionResult Predict(Int64)”的不可为空类型“System.Int64”的参数“UserId”的空条目。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:参数

这不起作用。抛出上面提到的错误

http://mysite/User/Profile/15

这有效

http://mysite/User/Profile/?UserID=15

控制器动作

public ActionResult Profile(long UserID)
{

}

当我将参数名称更改为Id它时,它可以工作。我认为这是因为Id在路由集合(Global.asax)中指定。是否可以告诉 MVCUserId应该映射到Id而不在Global.asax

4

3 回答 3

5

完成此任务的唯一方法(无需进入自定义 ModelBinders,这真的很麻烦)是:

  1. 使参数可以为空
  2. 事后使用RouteData集合设置属性。

 public ActionResult Profile(long? UserID)
 {
     UserID = UserID ?? long.Parse((string)RouteData.Values["id"]);
 }
于 2012-09-01T09:35:34.817 回答
0

我总是将控制器上的 id 参数设置为像 Id 这样的通用参数,然后您不必创建大量路由来匹配不同的 id 类型。

如果您没有使用可以为您的 id 为空的字符串,您可以提供一个默认值,例如 long id = 0 并将零值作为默认起始序列处理。

例如,在分页方法中,您可以将其设置为零,这样您就不需要第一页上的任何参数,但此后传递它会请求该页码等

于 2012-09-02T12:43:31.150 回答
0

我认为已经发布的代码应该可以工作,所以我测试了我的版本并且它有效:

public ActionResult Profile(long? UserID)
        {
            if (UserID.HasValue)
            {

            }
            else if (this.RouteData.Values["id"] != null)
            {
                long tempValue = 0;
                if (long.TryParse(this.RouteData.Values["id"].ToString(), out tempValue))
                {
                    UserID = tempValue;
                }
            }

            return View();
        }

希望能帮助到你。

于 2012-09-02T15:58:05.060 回答