在MVC 2.0项目中存储临时数据的位置

时间:2010-05-05 18:44:13

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

我开始学习MVC 2.0并且我正在尝试使用测验创建一个网站:用户被问到一个问题并给出了几个答案选项。如果他选择了正确的答案,他会获得一些积分,如果他没有,他会失去他们。

我尝试以下方式执行此操作


    public class HomeController : Controller
    {
       private ITaskGenerator taskGenerator = new TaskGenerator();
       private string correctAnswer;

    public ActionResult Index()
    {
        var task = taskGenerator .GenerateTask();
        ViewData["Task"] = task.Task;
        ViewData["Options"] = task.Options;

        correctAnswer= task.CorrectAnswer;
        return View();
    }

    public ActionResult Answer(string id)
    {
        if (id == correctAnswer)
            return View("Correct")

        return View("Incorrect");
    }
}

但是我遇到了一个问题:当用户回答时,cotroller类被重新创建并且我没有正确答案。那么存储正确答案的最佳位置是什么?我应该为此创建一个静态类吗? 谢谢你的帮助!

3 个答案:

答案 0 :(得分:2)

有多种不同的方法可以跨多个请求保留数据。

  • 缓存
  • 数据库层
  • 查看状态(向下渲染数据并在每个请求中将其传回)

仅举几例。其中最简单的可能是视图状态实现。你可以像这样滚动

<input type="hidden" name="question_1" value="<%=ViewData["question_1"]%>" />

此输入将在下次提交时重新发布,因此您可以跟踪该值。

public ActionResult Step1Post(string answer)
{
    ViewData["question_1"] = answer;
    return View("Step2")
}

public ActionResult Step2Post(string answer, string question_1)
{
    question_1; // the answer from step 1
    answer; // the answer from step 2
}

答案 1 :(得分:0)

您还可以使用唯一的密钥guid将其存储在会话中,并将视图中的仅sessionKey 存储为隐藏输入

实际上它可能还取决于您要存储的数据量

答案 2 :(得分:0)

这听起来像taskGenerator.GenerateTask()会给你某种类型的任务,但是任务持久存在吗? (这种方法从哪里获得任务)?

如果有与任务关联的ID,您可以在视图中向下发送taskId,然后在他们回答时再次查看任务。然后,您可以从该任务中获取CorrectAnswer并进行比较。