在重定向上传递消息以在ASP.NET MVC中查看

Imp*_*rks 7 asp.net asp.net-mvc redirect

我有一个ASP.NET MVC在线商店类应用程序,有两个视图:

  • 项目的页面(照片,描述等)
  • 用户可以留下评论的表单

用户成功提交表单后,应将其重定向回项目页面,并在顶部显示一次性消息:"您的评论已成功提交".

控制器代码(简化)如下所示:

[HttpGet]
public ActionResult ViewItem([Bind] long id)
{
    var item = _context.Items.First(x => x.Id == id);
    return View(item);
}

[HttpGet]
public ActionResult AddReview()
{
    return View();
}

[HttpPost]
public ActionResult AddReview([Bind] long id, [Bind] string text)
{
    _context.Reviews.Add(new Review { Id = id, Text = text });
    _context.SaveChanges();

    return RedirectToAction("ViewItem");
}
Run Code Online (Sandbox Code Playgroud)

有几个要求要满足:

  • 如果用户刷新项目页面,则不得再次显示该消息.
  • 该消息不得污染URL.
  • 控制器方法可能不会合并为一个.

我想将消息存储在用户会话中并在显示后将其丢弃,但是可能有更好的解决方案吗?

Jan*_*thy 17

通过使用tempdata,您可以将消息或数据(字符串/对象)从一个页面传递到另一个页面,并且它仅在一个动作之间有效.

关于tempdata的一些要点:

  1. TempData是ControllerBase类的属性.
  2. TempData用于将数据从当前请求传递到后续请求(意味着从一个页面重定向到另一个页面).
  3. 它的生命非常短暂,只有在目标视图满载之前才会存在.
  4. 需要进行类型转换以获取数据并检查空值以避免错误.
  5. 它仅用于存储错误消息,验证消息等一次性消息.与TempData的持久化数据参考这篇文章:与TempData的持久化数据

在你的控制器中:

    [HttpPost]
     public ActionResult AddReview([Bind] long id, [Bind] string text)
     {
        _context.Reviews.Add(new Review { Id = id, Text = text });
        _context.SaveChanges();

        TempData["message"] = "someMessage";
        return RedirectToAction("ViewItem");
     }
Run Code Online (Sandbox Code Playgroud)

在您的视图页面中:

     @TempData["message"]; //TempData["message"].ToString();
Run Code Online (Sandbox Code Playgroud)