0

我有一个基本控制器,如下所示

 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()但他们什么也没回来。

4

2 回答 2

5

ViewData 反映 ViewBag
您可以像这样迭代您存储的值:

ViewBag.Message = "Welcome to ASP.NET MVC!";
ViewBag.Answer = 42;

foreach (KeyValuePair<string, object> item in ViewData)
{
    // if (item.Key = "Answer") ...
}

这个链接也应该有用

于 2012-07-30T09:28:19.050 回答
-1

恐怕我不知道如何复制 ViewBag。

但是,我永远不会那样使用 ViewBag。

如果有人出于某些原因不喜欢使用 ViewModel,ViewBag 是 Controller 提供给 View 以呈现输出的一些数据。视图不应该知道任何关于控制器的信息,但你的 ViewBag 持有一个 ActionName ;)。

无论如何,ProceedLogOn 操作方法有很多参数......实际上不是一个很好的代码,所以为什么要犹豫添加更多当前保存在 MyController.Logon ViewBag 中的参数?然后在 ProceedLogOn 方法中,你有你想要的。

;)

于 2012-07-30T10:40:00.313 回答