-1

我正在创建一个包含五个步骤的 Web 应用程序。主页1 Page 2 查看确认。在 url 中,它类似于 localhost:22112/Home/Page1 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..
    }  
4

2 回答 2

0

如果您使用会话存储通过步骤的进度,您应该检查会话变量以验证请求是针对给定页面的,否则将用户重定向到第一个/当前完成的页面。

您可以为此编写一个自定义请求处理程序,以使您的会话验证代码与您的控制器代码分开

看到这个关于如何实现你想要做的基本功能的问题

编辑:

switch(currentStep){
   case 1:
     return Step1(model)
       break;
   case 2:
     return Step2(model)
       break;
   default:
       return new HttpNotFoundResult();
       break; 
}
于 2013-10-22T18:21:46.433 回答
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>

向导.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>

确认.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/

于 2013-10-22T19:14:31.610 回答