我有一个基础控制器,如关注
public abstract class BaseController
{
protected ActionResult LogOn(LogOnViewModel viewModel)
{
SaveTestCookie();
var returnUrl = "";
if (HttpContext != null && HttpContext.Request != null && HttpContext.Request.UrlReferrer != null)
{
returnUrl = HttpContext.Request.UrlReferrer.LocalPath;
}
TempData["LogOnViewModel"] = viewModel;
return RedirectToAction("ProceedLogOn", new { returnUrl });
}
public ActionResult ProceedLogOn(string returnUrl)
{
if (CookiesEnabled() == false)
{
return RedirectToAction("logon", "Account", new { area = "", returnUrl, actionType, cookiesEnabled = false });
}
var viewModel = TempData["LogOnViewModel"] as LogOnViewModel;
if (viewModel == null)
{
throw new NullReferenceException("LogOnViewModel is not found in tempdata");
}
//Do something
//the problem is I missed the values which are set in the ViewBag
}
}
和另一个控制器
public class MyController : BaseController
{
[HttpPost]
public ActionResult LogOn(LogOnViewModel viewModel)
{
// base.LogOn is used in differnet controller so I saved some details in view bag
ViewBag.Action = "LogonFromToolbar";
ViewBag.ExtraData = "extra data related only for this action";
return base.LogOn(viewModel);
}
}
问题是我在ProceedLogOn动作方法中错过了视图包值。 我在BaseController中的Logon方法中有值。
如何将ViewBag的值从一个Action复制到另一个Action?
所以我不能简单地说this.ViewBag=ViewBag;
因为ViewBag没有设置器。我想通过viewbag迭代。
我尝试了ViewBag.GetType().GetFields()
和ViewBag.GetType().GetProperties()
,但他们什么也没有回复。
答案 0 :(得分:4)
ViewData反映ViewBag
您可以像这样迭代您存储的值:
ViewBag.Message = "Welcome to ASP.NET MVC!";
ViewBag.Answer = 42;
foreach (KeyValuePair<string, object> item in ViewData)
{
// if (item.Key = "Answer") ...
}
此link也应该有用
答案 1 :(得分:0)
恐怕我没有答案如何复制ViewBag。
但是,我绝不会这样使用ViewBag。
ViewBag是Controller为了呈现输出而提供的一些数据,如果有人由于某些原因不喜欢使用ViewModel。 View永远不应该知道关于Controller的任何信息,但你的ViewBag持有一个ActionName;)。
无论如何,ProceedLogOn动作方法有很多参数......实际上并不是一个很好的代码,所以为什么在MyController.Logon ViewBag中添加更多当前被保存的参数呢?然后在方法ProceedLogOn中,你有你想要的东西。
)