![](/img/trans.png)
[英]Entity Framework & ASP.NET MVC: can't get to the [HttpPost] on my controller from another one
[英]ASP.NET Core (MVC): Can't get to the Login HttpPost action in controller
我正在尝试实现基本的(而不是粗略的)标识,但是我似乎无法真正在控制器中进行后期操作。
我有一个如下所示的帐户控制器:
[Authorize]
public class AccountController : Controller
{
private ApplicationDbContext _context;
public AccountController(ApplicationDbContext context)
{
_context = context;
}
[HttpGet]
[AllowAnonymous]
public IActionResult Login()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Login(Identity model)
{
var t = _context.LoginTable.FirstOrDefault(m => m.UserName == model.UserName);
if (t == null)
return View("Signup");
return View("Index");
}
}
我的剃刀视图如下所示:
@model MyProject.Models.Identity
@{
ViewData["Title"] = "Login";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Login</h2>
<form method="post">
<div class="form-group">
@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })
</div>
<div class="form-group">
@Html.LabelFor(m => m.Password)
@Html.TextBoxFor(m => m.Password, new { @class = "form-control", @type = "password" })
</div>
<button type="submit" name="login" value="Login">Login</button>
</form>
在我的startup.cs中-中间件是这样的:
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseAuthentication();
app.UseStaticFiles(); // serve static files (bootstrap, jQuery, css, etc.) first
app.UseMvc(ConfigureRoutes);
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
单击提交按钮时-在调试模式下,我确实单击了GET方法,但未单击POST。
我错过了什么?
编辑:可能正在使用的另一件事是,每次我尝试提交登录表单时,该URL都会添加另一个帐户%... login%...即第一次:
第二次:
HTTP://本地主机:64191 /帐号/登录RETURNURL =%2FAccount%2FLogin%3FReturnUrl%3D%252F
等等
看评论。 原来需要打开授权控制器。 因此,删除控制器上的[Authorize]
过滤器可使POST到达该控制器内部的动作。
放置好该过滤器后,POST会点击该过滤器,检查用户是否获得授权,然后在用户到达POST操作之前将其重定向到GET。
很高兴。 将其他答案留在下面(a)以使自己诚实(原始答案是错误的)和(b)万一其他人遇到该常见问题...
尝试在模型前面添加[FromBody],因此mvc知道您要从帖子主体中提取该模型。
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Login([FromBody] Identity model) {
... etc ....
}
这对我的开发团队来说是一个非常常见的失误(尤其是从较旧的.net应用转换)。
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Login(Identity model)
在这里,您需要AntiForgeryToken
但您未在视图中提供它。 您需要将其添加到表单中。
<form method="post">
@Html.AntiForgeryToken()
...
</form>
您还可以通过向mvc选项添加过滤器来自动进行此操作:
services.AddMvc(options =>
{
options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
});
您从控制器执行的操作将如下所示:
[HttpPost]
public IActionResult Login(Identity model)
和视图:
<form method="post">
...
</form>
HttpGet操作也具有[AllowAnonymous]
属性,HttpPost操作也应该具有它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.