参数字典包含非可空类型的参数“ID”无效项(The parameters dictionary co

2019-07-30 16:17发布

我试图经由我的数据库检索数据id在我的默认路由参数:

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

在这种的ActionResult我试图呈现一个自定义用户控件,根据路由标识参数,以便我检索为氏要求该页面的相关数据

public ActionResult InitPageNav(int id)
{
      PageModel page = PageNavHelper.GetPageByID(id);
      return PartialView("UserControls/_PageNavPartial", page);
}

编辑*

public static MvcHtmlString CreateMenuItems(this HtmlHelper helper, string action, string text)
{
     var menuItem = new TagBuilder("li");
     var link = new TagBuilder("a");

     //Get current action from route data
     var currentAction = (string)helper.ViewContext.RouteData.Values["action"];
     link.Attributes.Add("href", string.Format("/Home/{0}", action));

     if (currentAction == action)
     {
         menuItem.AddCssClass("selected");
         link.Attributes.Remove("href");
         link.Attributes.Add("href", string.Format("/Home/{0}", currentAction.ToString()));
     }

     link.SetInnerText(text);
     menuItem.InnerHtml = link.ToString();

     return MvcHtmlString.Create(menuItem.ToString());
 }

不过,我不断收到错误:

The parameters dictionary contains a null entry for parameter 'id' of non-nullable type

任何人都可以发现我要去哪里错了吗?

Answer 1:

要调用的动作,需要在URL中的一个整数,像这样:/首页/ InitPageNav / 1

如果不是这样,你改变了操作方法以允许空整型(但没有任何意义,除非你有如果没有ID被赋予可以检索默认页?)。

如果你不想在URL中的页面ID,你需要别的东西来识别页面,如标题?

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{title}", // URL with parameters
            new { controller = "Home", action = "Index", title = UrlParameter.Optional } // Parameter defaults
        );

和行动:

public ActionResult InitPageNav(String title)
{
      PageModel page = PageNavHelper.GetPageByTitle(title);
      return PartialView("UserControls/_PageNavPartial", page);
}

只要确保处理情况标题参数为空/空的情况。 一般应该使用助手/扩展已经存在于构建您的网址MVC框架。

@Html.ActionLink("Link text", "action", "controller", new { title = "whatever" }, null)

或者你更先进的帮手,

public static MvcHtmlString CreateMenuItems(this UrlHelper url, string action, string text)
{
     var menuItem = new TagBuilder("li");
     var link = new TagBuilder("a");

     //Get current action from route data
     var currentAction = (string)helper.RequestContext.RouteData.Values["action"];
     link.Attributes.Add("href", url.Action(action, "home", new { title = "whatever" }));

     if (currentAction == action)
     {
         menuItem.AddCssClass("selected");
     }

     link.SetInnerText(text);
     menuItem.InnerHtml = link.ToString();

     return MvcHtmlString.Create(menuItem.ToString());
 }


Answer 2:

如果异常/错误是由ASP .NET MVC框架抛出,那么这个异常的原因是,“ID”参数没有被在HTTP请求通过

尝试操作方法签名重新定义如下:

    public ActionResult InitPageNav(int? id) //id is now a nullable int type
    {
          if(!id.HasValue) //id parameter is set ?
          {
                //return some default partial view or something 
          }

          PageModel page = PageNavHelper.GetPageByID(id);
          return PartialView("UserControls/_PageNavPartial", page);
    }

编辑:如果你认为是比较有用的ID参数类型更改为“字符串”,那么你只需要改变操作方法签名。



文章来源: The parameters dictionary contains a null entry for parameter 'id' of non-nullable type