在多个视图之间保留数据的最佳方法是什么

时间:2014-05-01 18:17:12

标签: asp.net-mvc asp.net-mvc-4

我正在研究MVC 5应用程序并具有以下方案。 用户单击我的注册链接以创建帐户,并提供类似的视图。按预期工作。

[HttpGet]
[AllowAnonymous]
public ActionResult RenderRegisterModal(string userType)
{
    IList<UserTypesDto> userTypes = _userService.GetUserTypes();

    var usersRegisterUserViewModel = new UsersRegisterUserViewModel {UserTypes = new List<SelectListItem>()};

    usersRegisterUserViewModel.UserTypes.Add(new SelectListItem
    {
        Text = "Select a registration type",
        Value = "0"
    });

    foreach (UserTypesDto userTypeDto in userTypes)
    {
        usersRegisterUserViewModel.UserTypes.Add(new SelectListItem
        {
            Text = userTypeDto.UserType,
            Value = userTypeDto.UserTypeId.ToString()
        });
    }

    return PartialView("_RegisterModal", usersRegisterUserViewModel);
}

现在根据他们选择的customer / userType类型,我需要提供不同的视图。不应该有任何问题将视图转换为模态,因为它是ajax ...所以让我们称之为伪向导来收集数据。我正在考虑的问题以及这个可能简单的问题的基础,我在想太多,是如何保存每一步的数据?临时表? InMemory Cache使用会话ID作为密钥?饼干? “总收入”

该帖子的ActionMethod看起来像这样。

[AllowAnonymous]
[HttpPost]
public ActionResult Register(UsersRegisterUserViewModel usersRegisterUserViewModel)
{
    //TODO Return a view for the next step based on the CustomerType contained in the viewModel
    return View();
}

非常感谢任何反馈。

2 个答案:

答案 0 :(得分:2)

选项1:

最简单的方法是,NEXT视图有一组hidden个字段,其中包含在上一个视图中输入的信息,并将其发布到Action。

这样,一旦发布第二个视图,您将发布所有信息(前一个和您在第二个视图中输入的信息)。

选项2:

如果您对第一种方法不满意,可以在UserType组合更改中使用javascript中显示或隐藏的多个PartialView。您的ViewModel应具有在发回服务器之前保存信息所需的所有资产。

这个选项有两种版本:你在开头渲染你所有的usertype部分(所以你需要先隐藏它们),或者你可以在用户选择一个用户类型后通过Ajax获得部分。

选项3:

您可以使用Session来保存注册表单中的敏感数据,根据用户类型重定向到下一个视图,发布新表单,并在Action中从Session中检索信息...以及所有信息在你手中将它存储在数据库中。

答案 1 :(得分:0)

如果您正在使用剃须刀,请坚持使用模型的不同部分

@Html.EditorFor(model => model.data1)
@Html.EditorFor(model => model.data2) @*Wizard part 1*@

然后在向导的下一个视图中

@Html.HiddenFor(model => model.data1)
@Html.HiddenFor(model => model.data2)
@Html.EditorFor(model => model.data3)
@Html.EditorFor(model => model.data4) @*Wizard part 2*@

然后

@Html.HiddenFor(model => model.data1)
@Html.HiddenFor(model => model.data2)
@Html.HiddenFor(model => model.data3)
@Html.HiddenFor(model => model.data4)
@Html.EditorFor(model => model.data5) @*Wizard part 3...*@

依旧......