我可以将控制器中的数据附加到网址并仍然呈现相同的网页吗?

时间:2018-01-11 17:09:47

标签: asp.net-mvc razor

我有一个简单的MVC应用程序,向该人提供IQ测试。

我有一个控制器调用 TestMyIQController ,在这个控制器上我有三个操作方法,对应三个视图。

1)Index.cshtml

2)Questions.cshtml

3)Score.cshtml

在应用程序的第一页localhost:12345/TestMyIQ/Index上,我要求用户输入他们的名字和姓氏,然后单击“下一步”按钮转到第二页。

在应用程序localhost:12345/TestMyIQ/Questions的第二页上,我提出了一些选择题,我让用户为每个问题选择True / False。一旦用户完成所有问题,她可以单击提交按钮以查看她的IQ分数。

在最终得分页localhost:12345/TestMyIQ/Score上,我通过ViewBag对象显示得分。

但是,我想知道如何修改final page url以便我可以附加用户的First Name?例如,如果人名是John Doe,那么我希望我的最终得分网址如下localhost:12345/TestMyIQ/Score?firstname=John

请注意,没有必要将名字附加到所有其他网址...因为我只想在最终得分页面上找到它。

请帮帮我。感谢

3 个答案:

答案 0 :(得分:1)

考虑到您在“问题”操作中收到了第一个名称,并将其添加为模型的属性,您可以将其作为隐藏字段添加到表单中:

<强> Questions.cshtml

using(Html.BeginForm())
{
    @Html.HiddenFor(x => x.UserFirstName);
    // rest of form
}

TestMyIQController

[HttpPost]
public ActionResult Question(QuestionModel model)
{
    // form processing
    return RedirectToAction("Score", new{ firstName = model.UserFirstName })
}

因为在问题页面中您将其存储为隐藏字段,所以它只会显示在得分页面的网址中。

但请记住,虽然如果你正在学习并且只想做一些很酷的东西来展示你的朋友,这是好的,但这并不是处理所有这些问题的最佳方式。

编辑以添加有关使用此方法的问题的更多信息。

否定的是任何人都可以更改网址。没有什么能阻止我将?firstName=foo更改为?firstName=bar。其次,名称可以包含URL的无效字符,这些字符需要进行编码。第三,它是整体糟糕的设计。

有更好的方法可以解决这个问题,但这取决于你需要什么。用户是否可以分享网址?如果没有,您可以将其添加到Session。这在您当前的设计中更容易实现。如果他们这样做,您可以将结果存储在SQL表中,并将该网址共享为?scoreId=f88f9426-04d7-4ae2-8e15-a4bbd8d6faad

答案 1 :(得分:0)

我不确定我是否了解您的需求,但您不必将该名称存储在url中,您可以使用例如会话变量,但如果您坚持使用url,为什么不重定向(urlWithParameter)。

有关可能性的良好列表,请参阅 Msprogrammer

答案 2 :(得分:0)

可以选择会话来存储名称并在分数页面上检索它。

[HttpPost]
public ActionResult Index(UserModel model)
{
    // save the name 
    Session["FirstName"] = model.FirstName;

    return RedirectToAction("Questions")
}

在分数方法上,从会话中检索名称

[HttpPost]
public ActionResult Score(ScoreModel model)
{
    // save the name 
    string firstName = (string)Session["FirstName"];

    return RedirectToAction("Index")
}

希望它有所帮助。