【问题标题】:What is the best way to persist data between several views在多个视图之间保留数据的最佳方法是什么
【发布时间】:2014-05-02 03:38:07
【问题描述】:

我正在开发一个 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);
}

现在,根据他们选择的客户类型/用户类型,我需要呈现不同的视图。将视图放入模式中应该没有任何问题,因为它是 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();
}

任何反馈都将不胜感激。

【问题讨论】:

  • 您是否考虑过使用 TempData 集合。它只为来自用户的下一个请求保留数据。
  • TempData 使用 Session。客户端不允许会话变量。看起来我可能有 3 个步骤。
  • 仍在等待一个好的答案
  • 好吧@Romias 有一个很好的答案。但你也可以使用浏览器的本地存储。

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


【解决方案1】:

选项 1:

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

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

选项 2:

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

此选项有两种形式:您在开始时渲染所有用户类型部分(因此您需要首先隐藏它们),或者一旦用户选择了一种用户类型,您就可以通过 Ajax 获取部分。

选项 3:

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

【讨论】:

  • 不习惯将用户名和密码组合存储在隐藏字段中。我知道这是最简单的方法,只是看起来不太对。
  • 好吧,这对你来说不是最好的。所以...您需要使用 Ajax 获取附加视图...并将视图放在主窗体中。
  • 是的,我正在使用 ajax 将适当的视图返回到我的模态窗口,只是想弄清楚如何从第一步开始保存数据。一旦第一个视图发布到控制器,数据就消失了/返回的 PartialView 不可用。
  • 但是该方法应该只发布一次信息,因此,ajax 调用只是获取部分视图,然后将其放在 div 中,而不是替换主视图。然后,您一次发布所有信息。
  • 如果不允许会话,则选项 2 是一个。
【解决方案2】:

如果您使用剃须刀,请像这样保留模型的不同部分

@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...*@

等等……

【讨论】:

  • 请参阅对 Romias 的回答。
猜你喜欢
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多