3

我正在尝试通过id默认路由中的参数从我的数据库中检索数据:

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

在此 ActionResult 中,我尝试根据路由 id 参数呈现自定义用户控件,以便检索所请求页面的相关数据

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

谁能发现我哪里出错了?

4

2 回答 2

6

要调用该操作,URL 中需要一个整数,如下所示:/Home/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);
}

只需确保处理 title 参数为空/null 的情况。通常,您应该使用 Mvc 框架中已经存在的帮助程序/扩展来构建您的 url。

@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());
 }
于 2012-07-27T11:18:06.413 回答
6

如果 ASP .NET MVC 框架引发异常/错误,则此异常的原因是HTTP 请求上没有传递 'id' 参数

尝试将操作方法​​签名重新定义为以下内容:

    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 参数类型更改为“字符串”更有用,那么您只需更改操作方法签名。

于 2012-07-27T11:21:01.167 回答