TempData,ViewBag,没什么用

时间:2013-11-11 17:49:37

标签: c# asp.net-mvc asp.net-mvc-4 session-variables

我正在尝试将成功消息从Controller操作传递到View。 但是,我尝试或遇到谷歌的任何解决方案似乎都不起作用。经过一个小时试图找出我做错了什么,我会在这里问。

在exampel中我使用ViewBag,但我尝试过使用TempDate [“MyMessage”] =“一些消息”;仍然相同..在View ...中值始终为null

控制器

    public ActionResult EditSupplier(Supplier supplier)
    {
        try
        {
            if (ModelState.IsValid)
            {
                this._service.Update(supplier);
                ViewBag.UserMessage = "Supplier updated successfully";

            }
        }
        catch (Exception ex)
        {
            ModelState.AddModelError(String.Empty, ex.Message);
            TempData["UserMessage"] = "Error, supplier couldn't be updated";
            return View("Error");
        }
        return RedirectToAction("Supplier", new { id = supplier.SupplierId });
    }

查看

@if (ViewBag.UserMessage != null)
{
  <p>@ViewBag.UserMessage.ToString()</p>
}

1 个答案:

答案 0 :(得分:1)

RedirectToAction调用中,您通过向客户端浏览器发送“重定向”状态来重定向。一旦您返回该状态并结束您的响应,您的本地状态就会丢失 - 它不会持续到下一个请求。您需要另一种“方式”来保留该信息,例如重定向到SupplierEditSuccess,这将是一个假定编辑成功的视图,或者将Success参数传递给Supplier }表示上次编辑成功并相应地显示消息。

但是,在异常catch中,您应该能够在视图中看到TempData,因此如果您在this._service.Update(supplier);之后故意抛出异常,那么您应该能够在TempData["UserMessage"]中访问该消息{1}}。

编辑我写了很多关于在"storing a js value from 1 ActionResult to use in another ActionResult"的答案中在操作结果之间传递数据的内容,而不是直接在我对"Is ViewBag and ViewData also part of state management in asp.net mvc?"的回答中写的数据,这可能有助于您创建合适的内容您的方案的解决方案。