編集ページがあり、フォームが送信されると、ユーザーをインデックス ページにリダイレクトするのではなく、ページを更新しています。そのために、項目の ID を一時変数に保存し、それを使用して、一時変数 ID を使用してユーザーを編集ページにリダイレクトします。このようなもの:
[HttpGet]
public ActionResult Edit(Guid id)
{
TempData["CategoryID"] = id;
Category c = new CategoriesBL().GetCategory(id);
return View(c);
}
[HttpPost]
public ActionResult Edit(Category c)
{
new CategoriesBL().UpdateCategory(c);
return RedirectToAction("Edit", (Guid)TempData["CategoryID"]);
}
それはうまくいっています。ただし、同じページの別のフォームに 2 つのメソッドがあり、これら 2 つのメソッドのいずれかを送信すると、リダイレクトが機能せず、例外が発生します。
機能していない方法の 1 つ:
[HttpPost]
public ActionResult AddNewThumbnail()
{
List<byte[]> thumbs = new List<byte[]>();
for (int i = 0; i < Request.Files.Count; i++)
{
thumbs.Add(ConvertToByteArray(Request.Files[i].InputStream));
}
new CategoriesBL().AddCategoryThumbnail(thumbs, (Guid)TempData["CategoryID"]);
return RedirectToAction("Edit", (Guid)TempData["CategoryID"]);
}
例外:
パラメーター ディクショナリには、null 非許容型 'System.Guid' のパラメーター 'id' の null エントリが含まれています....
ルーティングの問題だと思いますが、実際には同じ実装が使用されており、一方のフォームでは機能していて、もう一方のフォームでは機能していません。私が何か間違ったことをしているのか、それともこれを行うためのより良い方法があるのか どうかはわかりません。
注: コードを数回デバッグしましたが、メソッドに渡す ID には値が含まれています。ただし、ページがリロードされると、URL には ID がありません。
デバッグ
問題は、私が使用しているさまざまなフォームが原因のようです。テキストを編集している最初のフォームは次のようになります。
@using (Html.BeginForm()) {
// ....
}
2番目のフォームでは、画像を保存してアップロードしているため、フォームは異なる必要があります
@using (Html.BeginForm("AddNewThumbnail", "Category", FormMethod.Post, new { enctype = "multipart/form-data" })) {
// ....
}
どういうわけか、フォームを「通常の」フォームに変更すると、すべてが機能しました。ただし、このフォームから画像を保存したいので、もちろん使用できません。