我正在创建一个Web应用程序,其中有五个步骤。 主页1 Page 2审核确认。 在网址中,它就像localhost:22112 / Home / Page1 Page 2等等。 我的问题是,如果有人复制localhost:22112 / Home / Page2,那么它会跳过所有内容 并直接跳到第2页。那么,我怎么能阻止它呢?我做了以下但是它不能正常工作。 任何建议都会非常有用。
在控制器中
private bool IsFromIndexPage()
{
if (Session["IsFromIndex"] != null)
{
return true;
}
else
{
return false;
}
}
对于每一页的动作结果,我都是这样写的。
[HttpGet]
public ActionResult Page1()
{
if (!IsFromIndexPage())
{
return RedirectToAction("Index");
}
.....other methods..
}
[HttpPost]
public ActionResult Page1(Information model, string command)
{
if (!IsFromIndexPage())
{
return RedirectToAction("Index");
}
.....other methods..
}
[HttpGet]
public ActionResult Page2()
{
if (!IsFromIndexPage())
{
return RedirectToAction("Index");
}
.....other methods..
}
[HttpPost]
public ActionResult Page2(Information model, string command)
{
if (!IsFromIndexPage())
{
return RedirectToAction("Index");
}
.....other methods..
}
答案 0 :(得分:0)
如果您正在使用会话来存储步骤,则应检查会话变量以验证请求是否针对给定页面,否则将用户重定向到第一个/当前已完成页面。
您可以为此编写自定义请求处理程序,以使会话验证代码与控制器代码分开
请参阅此Question,了解如何为您要执行的操作实现基本功能
编辑:
switch(currentStep){
case 1:
return Step1(model)
break;
case 2:
return Step2(model)
break;
default:
return new HttpNotFoundResult();
break;
}
答案 1 :(得分:0)
这是一个有点不同的方法,关于如何使用ajax使用asp.net MVC制作向导。
您的网址将是/ Home / Wizard的每一步。由于使用了AjaxOnly属性,因此无法访问Step1,Step2等(请参阅AjaxOnly底部的参考资料)
控制器:
public ActionResult Wizard()
{
return View();
}
[AjaxOnly]
public ActionResult Step1()
{
return PartialView("Step1");
}
[AjaxOnly]
public PartialViewResult Step2(FormCollection coll)
{
Session["FullName"] = coll["FullName"]!= null ? coll["FullName"].ToString() : string.Empty;
return PartialView("Step2");
}
[AjaxOnly]
public PartialViewResult Confirm(FormCollection coll)
{
WizardModel model = new WizardModel() { Name = Session["FullName"].ToString(), Phone = coll["Phone"] != null ? coll["Phone"].ToString() : string.Empty };
return PartialView("Confirm", model);
}
最后一步的模型:
public class WizardModel
{
public string Phone { get; set; }
public string Name { get; set; }
}
确保在页面/布局页面中引用jquery.unobtrusive-ajax
<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
Wizard.cshtml
@{
ViewBag.Title = "Wizard";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Wizard - Overview</h2>
@using (Ajax.BeginForm("Step1", new AjaxOptions { HttpMethod="Get", UpdateTargetId = "wizardcontainer" }))
{
<input type="submit" value="Start wizard" />
}
<div id="wizardcontainer"></div>
Step1.cshtml
<div>
<h2>Wizard - Step 1</h2>
<br />
@using(Ajax.BeginForm("Step2", new AjaxOptions { UpdateTargetId = "wizardcontainer" }))
{
@Html.Label("FullName")
@Html.TextBox("FullName")
<input type="submit" value="Next >>" />
}
</div>
Step2.cshtml
<div>
<h2>Wizard - Step 2</h2>
@using(Ajax.BeginForm("Confirm", new AjaxOptions { UpdateTargetId = "wizardcontainer" }))
{
@Html.Label("Phone")
@Html.TextBox("Phone")
@Ajax.ActionLink("<< Previous", "Step1", new AjaxOptions { UpdateTargetId = "wizardcontainer" })
<input type="submit" value="Next >>" />
}
</div>
Confirm.cshtml
@model MvcApplication2.Controllers.WizardModel
<div>
<h2>Wizard - Final Stage</h2>
Name: @Model.Name
<br />
Phone: @Model.Phone
@Ajax.ActionLink("<< Previous", "Step2", new AjaxOptions { UpdateTargetId = "wizardcontainer" })
</div>
在这里查看AjaxOnly属性: http://helios.ca/2009/05/27/aspnet-mvc-action-filter-ajax-only-attribute/