Action方法的预期参数名为Id,否则没有

时间:2012-09-01 09:31:09

标签: c# asp.net-mvc asp.net-mvc-3

  

错误

     

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

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

http://mysite/User/Profile/15

这有效

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

控制器动作

public ActionResult Profile(long UserID)
{

}

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

中更改{{1}}

3 个答案:

答案 0 :(得分:5)

实现这一目标的唯一方法(没有进入定制的ModelBinder,它变得非常毛茸茸)是:

  1. 使参数为nullable
  2. 使用 RouteData 集合在事后设置属性。

  3.  public ActionResult Profile(long? UserID)
     {
         UserID = UserID ?? long.Parse((string)RouteData.Values["id"]);
     }
    

答案 1 :(得分:0)

我总是在控制器上创建一个像id一样通用的id param,然后你不必创建很多路由来匹配不同的id类型。

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

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

的Si

答案 2 :(得分: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();
        }

希望它有所帮助。

相关问题