【问题标题】:Asp.net MVC passing data from one method to another method then to a viewAsp.net MVC 将数据从一种方法传递到另一种方法,然后再传递给视图
【发布时间】:2017-12-16 02:45:12
【问题描述】:

我对将数据从一个 ActionResult 传递到另一个 ActionResult 方法感到困惑。

让我来描述一下这是什么,

我需要将值从一种方法传递给另一种方法,并且该值必须在我从该另一种方法呈现的视图中可用。

我在我的项目中看到的是这个(这是编辑,但 [HttpPost] 编辑,它也重定向到编辑,但使用 [HttpGet] 插入 [HttpPost]):

TempData["Success"] = True;
return RedirectToAction("Edit/" + customer.Id, "Customer");

然后做了什么 [HttpGet] 编辑:

 if (TempData["Success"] != null && TempData.ContainsKey("Success"))
 ViewBag.Success = Convert.ToString(TempData["Success"]);
 return View(model);

正如您在 [HttpPost] 上看到的,TempData["Success"] 设置为 True; 并重定向到 [HttpGet] 方法,并编写下一个代码:

if (TempData["Success"] != null && TempData.ContainsKey("Success"))
 ViewBag.Success = Convert.ToString(TempData["Success"]);
 return View(model);

所以我想知道为什么需要设置TempData,然后根据TempDate 的值将值设置为ViewBag,我不能在重定向之前在我的第一个ActionResult 上设置ViewBag 的值吗?即使从HttpGet 操作结果渲染/调用视图,它也可以在视图上使用?

例如:

而不是这个:

TempData["Success"] = True;
return RedirectToAction("Edit/" + customer.Id, "Customer");

我可以简单地写在我的HttpPost

ViewBag.Success = True;
return RedirectToAction("Edit/" + customer.Id, "Customer");

或者这需要使用TempData 来完成,因为如果我不在重定向到视图的ActionResult 上设置值,ViewBag 在视图上将不可用,在这种情况下它是 HttpGet 而不是 HttpPost(这意味着我需要在 HttpGet 上设置 ViewBag 值?)

如果我必须这样做,我还可以使用两个 ViewBag,而不是 ViewBag 和 TempData?

为什么有人会这样解决它?这是正确的方法还是什么?

【问题讨论】:

  • 似乎只使用路由值比使用任何类型的包或临时数据更好。您不想对敏感信息执行此操作,但这并不敏感。我也会使用视图模型而不是 viewbag,但这是我的意见。
  • @ps2goat 我只是想知道为什么这样做(在操作结果之间发送数据),使用这个 TempData,是好方法,坏方法还是其他方法,可能有更好的方法或其他方法。 .
  • 有一篇很棒的文章:When to use ViewBag, ViewData, and TempData 在文章中你会发现它解释了 ViewData 和 ViewBag 在控制器重定向时被重置为 Null,因此,TempData 是要走的路。但是,我同意 ps2goat 并将模型传递到下一个视图将是解决此问题的正确方法。
  • @RyanCarlisle 基本上这就是为什么使用 tempData 的原因,因为如果我重定向到另一种方法,ViewData 和 ViewBag 将被重置为 Null。谢谢伙计

标签: c# asp.net asp.net-mvc actionresult


【解决方案1】:

我不能只在我的第一个 ActionResult 上设置 ViewBag 的值吗 重定向,因此它也可以在视图上使用

你不能,因为 Http 是无状态的。因此,我们使用 TempData 来存储 临时 数据,以便持久化 Http 请求。

为什么有人会这样解决它?它是否正确 方法还是什么?

就 ASP.NET MVC 而言,您使用的这种方法很好,因为我们没有其他方法可以在 Http 请求之间保留 临时 数据。

如果您发现自己经常这样做,您可能需要考虑使用alert extension methods 在烤面包机内显示一条消息。

Usage

[HttpPost]
public ActionResult Edit(SettingModel model)
{
   if (ModelState.IsValid)
   {
       ...
      return RedirectToAction("List")
          .WithSuccess($"Setting was updated successfully.");
   }
   return View(model);
}

【讨论】:

    【解决方案2】:

    有几种技术可以实现 Post/Redirect/Get 模式。

    TempData 是为单个重定向传递信息的一种方式。这种方法的缺点是,如果用户在最终重定向页面上点击刷新 (F5),他将不再能够提取数据,因为这些数据将从 TempData 中消失以供后续请求。

    另外两种方法是查询字符串参数和持久化。

    【讨论】:

      【解决方案3】:

      在这种情况下不能使用第一个ViewBag,因为您正在进行重定向。重定向意味着在特定的操作/控制器上发出完整的请求。 ViewBag 本质上仅用于在单个请求中将数据从操作传递到视图,这意味着进行重定向将擦除保存在 ViewBag 中的所有数据。在这种情况下,我认为唯一最好的方法是使用TempData,因为即使进行了重定向,它也会保留数据,但是当在同一个控制器中进行重定向时,所以如果你进行重定向到另一个控制器,您最终将丢失您在 TempData 对象中注册的数据。

      我可以看到您正在尝试找到一种方法来提醒用户注意不同的通知,但您可以查看我的答案 here 以了解该方法的详细信息:

      【讨论】:

        猜你喜欢
        • 2013-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-24
        • 1970-01-01
        • 2017-07-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多