私は次の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
);
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
);
最後の行を参照してください。
/
のようなURLを呼び出す場合は、コントローラー、アクション、およびID(パラメーター)の間の区切り文字として/Product/Details?ProductId=1
文字を設定しますが、コントローラーはProduct
を呼び出しますがアクションテキストがDetails?ProductId=1
の場合、ルーティングは次の/
を取得しません。