我有一个简单的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
。
请注意,没有必要将名字附加到所有其他网址...因为我只想在最终得分页面上找到它。
请帮帮我。感谢
答案 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")
}
希望它有所帮助。