在MVC视图之间持久化数据的最标准方法是什么



我正在创建一个使用ASP.NET MVC来填写在线作业应用程序的系统。这实际上只是一个熟悉MVC框架的实验。我绝对不是安全专家,所以我只是想在这里得到一些建议,因为这个网络应用程序将处理敏感信息。

系统有一组类似向导的视图。你从一个视图到下一个视图填写相关信息,直到最后提交

每个作业应用程序都使用GUID主键存储在数据库中。现在,我只是将GUID存储在每个页面视图的隐藏字段中。这使得在控制器中更新模型变得很容易,如下所示:

[HttpPost]
public ActionResult ExampleAction(FormCollection formValues)
{
    Guid appId = new Guid(Request.Form["ModelId"]); // the GUID stored in the hidden field
    ExampleModel example = db.Entities.Single(e => e.ModelId == appId);
    UpdateModel(example, formValues);
    db.SaveChanges();
    return RedirectToAction("ExampleAction2", new { appId = appId.ToString() });
}

我知道这是不安全的,因为任何有任何开发经验的人都知道你可以在任何浏览器的开发工具中编辑隐藏字段的值。那么,安全地获得相同结果的推荐方法是什么呢?

您应该将其存储在Session对象中。这样,你就可以随时随地调用它,它永远不会显示在你的任何视图中。医生:http://msdn.microsoft.com/en-us/library/ms178581.aspx

我知道这个问题已经得到了回答,只是出于兴趣,我想留下另一个选项。如何做到这一点,就是将从第一个视图中获得的信息解析为JSON字符串,您可以将其存储在cookie中,然后在需要时对其进行序列化。

这表明信息存储在客户端是安全的。否则,我想它可能是一个加密的cookie。这将解决云计算和负载均衡器等方面的问题。

为什么不发布到每个步骤而不是使用RedirectToAction?这样,您就可以创建一个包含每个步骤的模型。。例如:

class JobApplicationViewModel
{
    public Guid ApplicationGuid { get; set; }
    public StepOne Step1 { get; set; }
    public StepTwo Step2 { get; set; }
    public int CurrentStep { get; set; }
}

步骤1视图可以发布到步骤2。例如:

[HttpPost]
public ViewResult StepTwo(JobApplicationViewModel viewModel)
{
    ServiceLayer.Update(viewModel);
    return View(viewModel);
}

然后,StepTwo视图发布到StepThree,StepThree发布到Step4,等等。这在逻辑上是有意义的,因为你只允许人们通过发布表单进入步骤1之外的任何步骤。

最新更新