1

我有一个编辑页面,提交表单后,我会刷新页面,而不是将用户重定向到索引页面。为此,我将项目的 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" })) {
    // ....
}

不知何故,当我将表格更改为“正常”表格时,一切正常。但是我当然不能使用它,因为我想从这个表单中保存图像。

4

2 回答 2

0

从你的角度传递价值。像这样的东西

[HttpPost]
public ActionResult Edit(Category c, FormCollection f)
{
   Guid categoryID =  (Guid)f["catergoryID"];
   new CategoriesBL().UpdateCategory(c);
   return RedirectToAction("Edit", catergoryID);
}
于 2013-08-02T11:14:44.160 回答
0

在您的第一个示例中,您进行了初始化:

TempData["CategoryID"] = id;

GET方法。因此,您必须先初始化您的(Guid)TempData["CategoryID"],然后再尝试在此处访问它:

return RedirectToAction("Edit", (Guid)TempData["CategoryID"]);

于 2013-08-02T11:35:55.680 回答