我无法将我的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();
}
}
}
答案 0 :(得分:2)
每msdn RedirectToAction
会对Review
操作产生另一个获取请求。
返回HTTP 302的响应 浏览器,导致浏览器 向指定的请求发出GET请求 动作。
这会导致wizard
对象失去其值并需要重新填充。
View()
只返回与当前上下文中该操作相关联的视图。
如果可能,您可以将向导置于TempData
,return 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的视图。审核需要是基于与向导相同的类的强类型视图。
如果这不能回答您的问题,则发布您的观看代码会很有帮助。