在发布数据时维护ViewBag值

mmu*_*taq 2 c# jquery viewdata viewbag asp.net-mvc-4

我有一个需要回答的逻辑问题!

这是一个场景..

- 在控制器中

ViewBag.Name = "aaaa";
Run Code Online (Sandbox Code Playgroud)

- 在视图中

@ViewBag.Name
Run Code Online (Sandbox Code Playgroud)

"在我的控制器中,我已经为ViewBag设置了值,并在VIew中从ViewBag中检索了值.现在在View中,我有一个按钮,它将一些数据发布到HttpPost方法.在HttpPost方法中,我更改了ViewBag的值.那么在执行该方法之后,viewbag中的值是否会因当前视图而改变?"

- 在HttpPost方法中

ViewBag.Name="bbbb";
Run Code Online (Sandbox Code Playgroud)

Shy*_*yju 10

您在操作方法上设置的ViewBag数据仅对您正在使用的即时视图可用.当您将其发布回服务器时,它将无法使用,除非您将其保留在表单内的隐藏变量中.这意味着,在HttpPost操作方法中更改ViewBag数据后,您可以在视图中看到返回

public ActionResult Create()
{
  ViewBag.Message = "From GET";
  return View();
}
[HttpPost]
public ActionResult Create(string someParamName)
{
  ViewBag.Message = ViewBag.Message + "- Totally new value";
  return View();
}
Run Code Online (Sandbox Code Playgroud)

假设您的视图正在打印ViewBag数据

<h2>@ViewBag.Message</h2>
@using(Html.BeginForm())
{
  <input type="submit" />
}
Run Code Online (Sandbox Code Playgroud)

结果将是

对于你的GET Aciton,它将打印" From GET"

用户提交表格后,将打印" Totally new value";

如果您希望发布以前的视图包数据,请将其保留在隐藏的表单字段中.

<h2>@ViewBag.Message</h2>
@using(Html.BeginForm())
{
  <input type="hidden" value="@ViewBag.Message" name="Message" />
  <input type="submit" />
}
Run Code Online (Sandbox Code Playgroud)

而你的Action方法,我们也会接受隐藏的字段值

[HttpPost]
public ActionResult Create(string someParamName,string Message)
{
  ViewBag.Message = ViewBag.Message + "- Totally new value";
  return View();
}
Run Code Online (Sandbox Code Playgroud)

结果将是

对于你的GET Aciton,它将打印" From GET"

用户提交表格后,将打印" From GET-Totally new value";

尽量避免像ViewBag/ViewData这样的动态内容在您的操作方法和视图之间传输数据.您应该使用强类型视图和视图模型模型.