MVC路由问题 - 刷新同一页面

时间:2013-08-02 11:01:33

标签: asp.net-mvc routing page-refresh

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

不知何故,当我将表单更改为“正常”时,一切都有效。但我当然不能使用它,因为我想保存这种形式的图像。

2 个答案:

答案 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}}

相关问题