将ViewModel对象从ActionMethod传递给另一个

时间:2011-05-01 14:16:02

标签: asp.net-mvc asp.net-mvc-3 routing viewmodel

我的网络应用程序的侧栏中有一个注册表单。当用户提交输入的数据时,应该将用户重新定向到具有更完整的注册表单的另一页面,此时他可以填充其余数据。用户以第一种形式输入的数据应该已经存在于第二种形式,但是没有发生...我检查了视图模型的值我传递给第二种操作方法它是null并在浏览器的地址栏中我得到:

http://localhost:2732/User/RegisterPage?model=Sharwe.MVC.ViewModels.RegisterPageViewModel

以下是代码:

    public ActionResult Register()
    {
        return PartialView(new RegisterViewModel());
    }

    [HttpPost]
    public ActionResult Register(RegisterViewModel dto)
    {
        var model = Mapper.Map<RegisterViewModel, RegisterPageViewModel>(dto);
        return RedirectToAction("RegisterPage", "User", new { viewModel = model });
    }

    public ActionResult RegisterPage(RegisterPageViewModel viewModel)
    {
        return View(viewModel);
    }

这不是这样做的方法吗?或者我在这里遗漏了什么......?

2 个答案:

答案 0 :(得分:3)

传递给RedirectToAction()的词典是路径值而不是视图模型。而RedirectToAction()基本上是告诉浏览器转到某个URL。默认情况下,浏览器会发出GET请求,显然您会丢失数据。

为此,您需要使用TempData字典。您可以将视图模型存储在TempData中,然后将RedirectToAction()存储到RegisterPage。 TempData仅保存1个请求范围的数据,并自动将其删除。这是这种情况的理想选择。

有关详细信息,请参阅此处&gt; The value for a object inside a viewmodel lost on redirect to action in asp.net mvc 2.0?

答案 1 :(得分:1)

在这种特殊情况下,您无需使用RedirectToAction,只需直接调用RegisterPage操作即可:

[HttpPost]
public ActionResult Register(RegisterViewModel dto)
{
    var model = Mapper.Map<RegisterViewModel, RegisterPageViewModel>(dto);
    return RegisterPage(model);
}

public ActionResult RegisterPage(RegisterPageViewModel viewModel)
{
    return View(viewModel);
}