【问题标题】:Can't pass viewmodel to new action by RedirectToAction无法通过 RedirectToAction 将视图模型传递给新操作
【发布时间】:2009-07-01 13:33:03
【问题描述】:

我有一个表单,当用户提交表单时,我想引导用户新视图显示提交的结果(将视图模式数据传输到显示视图)。

public class HomeController : Controller
    {
        private MyViewModel _vm;
        .....

        // POST: /Home/Create        
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create(MyViewModel vm){
           //.....
           //set up vm to temp data _vm
           _vm = vm;

           return RedirectToAction("DisplayData");
        }
        // GET: /Home/DisplayData
        public ActionResult DisplayData()
        {
           //get temp data for display
           return View(_vm);
        }
}

当我发布表单时,我可以创建虚拟机并将其放入临时数据位置_vm。但是这个 _vm 可以发送到另一个动作 DisplayData,它在动作 DisplayData() 中为空。似乎即使在同一控制器中重定向操作时,_vm 也会丢失,尽管它是控制器 var,而不是操作方法 var。

如何解决这个问题?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    它创建一个新的控制器实例,因为它是一个新请求,因此您发现它将为空。 您可以使用 TempData 来存储 vm,TempData 仅保留 1 个请求的数据

    很好的解释here

    【讨论】:

      【解决方案2】:

      一个好方法是调用

      return DisplayData(_vm)
      

      而不是

      RedirectToAction("DisplayData")
      

      DisplayData 无论如何都应该接受模型。

      【讨论】:

      • 但是你会丢失 Post、Redirect、Get Pattern
      • RedirectToAction("DisplayData") 将通过发布操作返回当前视图。
      • @KentZhou 不确定我是否理解你。当您重定向 HTTP“位置”标头时,会告诉浏览器去哪里,并且浏览器会对该页面发出 GET 请求。它不会做一个帖子。
      • 如果使用 RedirectToAction("DisplayData"),需要一个动作来处理它。如果action是public ActionResult DisplayData(),我什至不能通过编译。如果 action 是 public ActionResult DisplayData(MyViewModel vm),它将返回 for form 视图,而不是 displaydata 视图。这是我在不同场景下的尝试结果。
      猜你喜欢
      • 2012-12-07
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 2012-03-29
      相关资源
      最近更新 更多