web-dev-qa-db-ja.com

RouteValuesでのHtml.ActionLinkの使用

私は次のHTMLを持っています:

<%: Html.ActionLink(item.ProductName, "Details", "Product", new { item.ProductId }, null)%>

これは次のようにレンダリングされています:

<a href="/Product/Details?ProductId=1">My Product Name</a>

ただし、これをクリックすると、次のエラーが発生します。

パラメータディクショナリには、「MyProject.Controllers.ProductController」のメソッド「System.Web.Mvc.ActionResultDetails(Int32)」のnull許容型ではないタイプ「System.Int32」のパラメータ「id」のnullエントリが含まれています。オプションのパラメーターは、参照型またはnull許容型であるか、オプションのパラメーターとして宣言されている必要があります。

パラメータ名:パラメータ

私のルーティングは「?ProductId = 1」クエリ文字列を好まないようです。

代わりに使用する場合:

<%: Html.ActionLink(item.ProductName, string.Format("Details/{0}", item.ProductId), "Product", null, null)%>

次のリンクがレンダリングされます。

<a href="/Product/Details/1">My Product Name</a>

...そしてこれはクリックすると正しく機能します。

ここで基本的なものが欠けていますか? RouteValuesを使用したいのですが、なぜこのエラーがスローされるのかわかりません。 Controllerメソッドでクエリ文字列パラメーターを受け入れるにはどうすればよいですか?

私が持っている唯一のルートマッピングは次のとおりです。

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

ActionパラメーターをintProductIdに変更します。

public ActionResult Details(int productId)
{
    return View("");
}

コントローラは「id」パラメータを取得する必要があります。これは、not nullable intとして宣言したため、productIdを送信しても、関数のシグネチャと一致しません。
パラメータ名を指定しない場合、global.asaxのルーティングデフォルトはパラメータ名をidに変更します。

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

最後の行を参照してください。

10
gdoron

/のようなURLを呼び出す場合は、コントローラー、アクション、およびID(パラメーター)の間の区切り文字として/Product/Details?ProductId=1文字を設定しますが、コントローラーはProductを呼び出しますがアクションテキストがDetails?ProductId=1の場合、ルーティングは次の/を取得しません。

1
Galled