3

I'm trying to retrieve data from my db via the id parameter in my default route:

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

In this ActionResult I'm trying to render a custom user control, based on the route id parameter so that I retrieve the relevant data for the page that's requested

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

Edit*

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());
 }

But I keep getting the error:

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

Can anyone spot where I'm going wrong?

Jonathan Hall
  • 75,165
  • 16
  • 143
  • 189
dtsg
  • 4,408
  • 4
  • 30
  • 40

2 Answers2

5

If the exception/error is thrown by the ASP .NET MVC Framework, then the reason of this exception is that 'id' parameter is not being passed on the HTTP request.

Try to redefine the action method signature to the following:

    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);
    }

EDIT: If you think that is more useful to change the id parameter type to 'string', then you just have to change the action method signature.

hiddenbyte
  • 98
  • 6