MVC 4 URL绕过

时间:2013-10-22 18:12:01

标签: url asp.net-mvc-4

我正在创建一个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..
    }  

2 个答案:

答案 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/