在MVC5中使用表单身份验证时,以不同的操作方法触发了按钮单击

时间:2019-03-14 07:25:31

标签: c# asp.net-mvc post razor forms-authentication

我的MVC5项目结构如下:

Project
  - App_Data
  - App_Start
      - RouteConfig.cs
  - Controllers
      - AccountController.cs
      - HomeController.cs
  - Views
      - Account
          - Index.cshtml
      - Home
          - Index.cshtml
      - web.config
  - Global.asax
  - Web.config

在“视图”->“帐户”->“ Index.cshtml”中是登录页面,其当前视图为:

@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        @using (Html.BeginForm("Login", "Account", FormMethod.Post))
        {
          <p>
              from Account
          </p>
          <input type="submit" value="Post" />
        }

    </div>
</body>
</html>

AccountController代码为:

  public class AccountController : Controller
    {
        // GET: Account
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        [AllowAnonymous]
        public ActionResult Login()
        {
            if (true)  //assuming validation is true
            {
                FormsAuthentication.RedirectFromLoginPage("test", false);
            }
            return null;
        }
    }

当用户请求此页面时,将调用Index()方法,而当用户单击Submit按钮时,将触发Login()方法。 奇怪的是,当我单击形式为POST的按钮Submit按钮时,它在Index()方法而不是Login()中达到了控制器中的断点。

在检查按钮时,表单标签具有:

<form action="/Account/Login" method="post"> 

因此,我复制了URL并将其粘贴到浏览器(http://localhost:55136/Account/Login)中,调用了Index()方法而不是Login()。但是,如果我从web.config和FormsAuthentication.RedirectFromLoginPage(“ test”,false);中删除formsauthentication的代码,则效果很好。

用于表单身份验证的Web.config文件是:

<system.web>    
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Index" defaultUrl="~/Home/Index" >
        <credentials passwordFormat="Clear"></credentials>
      </forms>
    </authentication>
    <authorization>
      <deny users="?"/>
    </authorization>    
    <compilation debug="true" targetFramework="4.6.1"/>
    <httpRuntime targetFramework="4.6.1"/>
  </system.web>

我在RouteConfig.cs文件中的路由是:

  public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }

我现在不了解MVC的行为。这从来没有发生过。为什么MVC会这样?如何在“提交”点击时重定向到Login()?

1 个答案:

答案 0 :(得分:0)

您的Web.config应该具有如下所示的标记:

<system.web>...</system.web>
<system.webServer>
    <modules>
      <remove name="FormsAuthenticationModule" />
    </modules>
</system.webServer>