返回View(模型)和返回RedirectToAction(“ViewName”,模型)之间有什么区别

时间:2011-07-01 15:25:07

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

我无法将我的Index()动作传递给我的Review()动作

... ActionResult Index()...

            else
            {
                return RedirectToAction("Review", wizard); <--wizard is a valid object here....

            }

ActionResult Review()

    public ActionResult Review()
    {
        return View(_wizard); <-- THis is always null.
    }

更新 这是我的整个控制器。我想将用户从向导索引,审阅页面,然后最终到实际保存数据的传输页面。我在最后一块环绕着头脑时遇到了真正的问题。当你习惯于asp经典,你必须从头开始明确地编写所有内容时,很难习惯MVC3中的Magic继承。所以,我打赌我写了很多不受欢迎的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using mvc3test.Models;
using Microsoft.Web.Mvc;
using System.Web.Mvc;
using mvc3test.Services;

namespace mvc3test.Controllers
{

    public class WizardController : Controller
    {

        private WizardViewModel wizard = new WizardViewModel();
        private DR405DBContext db;

        public WizardController(IDBContext dbContext)
        {
            db = (DR405DBContext)dbContext;
        }

        public WizardController()
        {
            db = new DR405DBContext();
        }

        public ActionResult Index()
        {

            wizard.Initialize();
            return View(wizard);
        }

        [HttpPost]
        public ActionResult Index([Deserialize] WizardViewModel wizard, IStepViewModel step)
        {

            wizard.Steps[wizard.CurrentStepIndex] = step;
            if (ModelState.IsValid)
            {
                if (!string.IsNullOrEmpty(Request["next"]))
                {
                    wizard.CurrentStepIndex++;
                }
                else if (!string.IsNullOrEmpty(Request["prev"]))
                {
                    wizard.CurrentStepIndex--;
                }
                else
                {
                    return View("Review", wizard);

                }
            }
            else if (!string.IsNullOrEmpty(Request["prev"]))
            {
                wizard.CurrentStepIndex--;
            }
            return View(wizard);


        }


        [AllowAnonymous]
        public ActionResult Review(WizardViewModel model)
        {
            return View(model);
        }

        [AllowAnonymous]
        [HttpGet]
        public ActionResult Review(Int32 ID)
        {
            var service = new DR405Service(db);
            var myWizard = service.WireUpDataModelToViewModel(service.DBContext.dr405s.Single(p => p.ID == ID));

            return View(myWizard);
        }


        public ActionResult Transmit()
        {
            var service = new DR405Service(db);
            service.Wizard = wizard;
            service.Save();
            return View();
        }


    }
}

3 个答案:

答案 0 :(得分:2)

msdn RedirectToAction会对Review操作产生另一个获取请求。

  

返回HTTP 302的响应   浏览器,导致浏览器   向指定的请求发出GET请求   动作。

这会导致wizard对象失去其值并需要重新填充。

View()只返回与当前上下文中该操作相关联的视图。

如果可能,您可以将向导置于TempDatareturn View("Review", wizard)或将wizard作为路由值传递。

答案 1 :(得分:1)

RedirectToAction向浏览器返回HTTP 302响应,这会导致浏览器向指定的操作发出GET请求。所以你不能像你那样传递复杂的对象

这不是最佳解决方案,但在重定向ViewData之前尝试放置向导对象:

ViewData["wizard"] = wizard

然后在Review()

中获取它
var wizard = (Wizard)ViewData["wizard"];

答案 2 :(得分:0)

返回RedirectToAction(“Review”,向导);将向导对象传递给名为Review的视图。审核需要是基于与向导相同的类的强类型视图。

如果这不能回答您的问题,则发布您的观看代码会很有帮助。