我有一个编辑页面,提交表单后,我正在刷新页面,而不是将用户重定向到索引页面。为此,我将项目的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"]);
}
这很好用。但是我在同一页面上有两种不同形式的方法,每当我提交这两种方法中的任何一种时,重定向都不起作用,我得到一个例外。
其中一种不起作用的方法:
[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"]);
}
例外:
参数字典包含非可空类型'System.Guid'的参数'id'的空条目....
我认为这是路由问题,但事实是使用相同的实现,它在一个表单而不是另一个表单上工作。我不确定我是做错了什么,或者是否有更好的方法来做到这一点。
注意:我已多次调试代码,并且我传递给方法的ID确实有一个值。但是,当页面重新加载时,URL没有ID。
调试
问题似乎是由于我使用的形式不同。第一种形式我只是编辑文本,就像这样:
@using (Html.BeginForm()) {
// ....
}
在第二种形式中,我正在保存和上传图像,因此表单必须不同
@using (Html.BeginForm("AddNewThumbnail", "Category", FormMethod.Post, new { enctype = "multipart/form-data" })) {
// ....
}
不知何故,当我将表单更改为“正常”时,一切都有效。但我当然不能使用它,因为我想保存这种形式的图像。
答案 0 :(得分:0)
从您的视图中传递值。像这样的东西
[HttpPost]
public ActionResult Edit(Category c, FormCollection f)
{
Guid categoryID = (Guid)f["catergoryID"];
new CategoriesBL().UpdateCategory(c);
return RedirectToAction("Edit", catergoryID);
}
答案 1 :(得分:0)
在您的第一个示例中,您已初始化:
TempData["CategoryID"] = id;
GET
方法中的。因此,您必须在尝试访问(Guid)TempData["CategoryID"]
之前初始化return RedirectToAction("Edit", (Guid)TempData["CategoryID"]);
:
{{1}}