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

それか、null許容整数を許可するようにアクションメソッドを変更します(ただし、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の場合を必ず処理してください。そして一般的には、URLを構築するために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());
 }
于 2012-07-27T11:18:06.413 に答える
6

ASP .NET MVC Frameworkによって例外/エラーがスローされた場合、この例外の理由は、「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パラメータタイプを「文字列」に変更する方が便利だと思う場合は、アクションメソッドのシグネチャを変更するだけです。

于 2012-07-27T11:21:01.167 に答える