Asp.net MVC将数据从一个方法传递到另一个方法然后传递给视图

时间:2017-07-11 21:22:42

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

我很困惑,将数据从一个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及以后,可以&# 39;我只是在重定向之前在我的第一个ActionResult上设置ViewBag的值,所以即使从HttpGet动作结果呈现/调用视图,它也可以在View上使用?

例如:

而不是:

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?

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

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

  

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

上使用

你不能,因为 Http是无国籍的 。因此,我们使用 TempData 来存储临时数据,以便保留Http请求。

  

为什么有人会像这样解决它?它是否正确   接近还是什么?

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

如果您经常看到自己这样做,可能需要考虑使用alert extension methods在烤箱内显示消息。

enter image description here

<强> Usage

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

答案 2 :(得分:0)

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

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

相关问题