我有一个使用ASP.NET Core(最新版本)制作的Web应用程序,该应用程序需要使用一个弹出式表单,其中必须填写1个值,然后将其发送回控制器以供以后使用该值。
因此过程是这样的:按钮>单击按钮>弹出表单(图像:pop-up form which is a partial view)>填写值>提交>将结果发送回控制器。
但是,每当我按下“提交”按钮时,它就会使我进入“ 400错误未找到”页面。怎么可能出问题了?
这是部分视图弹出表单代码:
@model IEnumerable<ApplicationName.Models.Moederblad>
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, AuthoringTagHelpers
@Html.AntiForgeryToken()
<div id="element_to_pop_up">
<a class="b-close">x</a>
//Actionresult > Controller
@using (Html.BeginForm("Incassodatum", "Moederblads", FormMethod.Post))
{
<br />
<div class="row">
<div class="col-md-6">
<label for="Incassodatum">Incassodatum</label>
<input class="form-control" placeholder="Bijvoorbeeld: 19-02-2020" type="text" data-val="true" data-val-regex="Dat is geen geldige datum" data-val-regex-pattern="^(0[1-9]|[12][0-9]|3[01])[/](0[1-9]|1[012])[/](19|20)[0-9]{2}$, " id="Incassodatum" name="Incassodatum">
</div>
</div>
<div class="row">
</div>
<br>
<input name="__RequestVerificationToken" type="submit" class="btn btn-primary submit" value="Toevoegen" id="submit">
}
</div>
这是对应的控制器:
[HttpGet]
public ActionResult Incassodatum()
{
return View();
}
//Automatisch de datum van vandaag in het Incassodatum veld zetten nadat er op een knop is gedrukt
[HttpPost, ValidateAntiForgeryToken]
public ActionResult Incassodatum(string Incassodatum)
{
string date= "";
if (ModelState.IsValid)
{
date = Incassodatum;
}
else
{
date = "Something went wrong.";
}
TempData["Incassodatum"] = $"{Incassodatum}";
return RedirectToAction("Index");
}
然后,我可以使用tempdata读取该值,但是它根本不起作用,因此实际上暂时没有用。
我尝试在帖子上方添加[Route(“ Moederblads / Incassodatum”)]属性。 我在普通视图(不是局部视图)中尝试过,在那里可以看到F12的值。 尝试更改对象名称,因为我认为它可能与其他名称冲突。
不知道现在该怎么办。你们中有人猜吗?
答案 0 :(得分:0)
但是,每当我按下“提交”按钮时,它就会使我进入一个400错误未找到页面。
400错误是错误请求。 404是找不到。因此,我不确定您实际到达的是哪个。但是,基于您输入的名称为__RequestVerificationToken
,而您使用的输入错误的事实,我倾向于使用400。
由于您尝试使用此输入作为按钮,因此已在其上设置了一个值,以将该文本应用于按钮。但是,这实际上将为__RequestVerificationToken
发布该值,并且不是有效令牌。因此,由于请求验证失败,您将始终收到400错误请求。
请求验证令牌应该在隐藏的输入上,因此最简单的解决方案是从该按钮中删除名称,并添加专门用于请求验证令牌的隐藏输入:@Html.AntiForgeryToken()
。
最好使用内置的FormTagHelper
,它会自动处理防伪令牌:
<form asp-action="Incassodatum" asp-controller"Moederblads" method="post">
...
</form>
最后,尽管从技术上讲它没有任何作用,但应使用input
作为按钮是一种反模式。请改用<button type="submit">
。
答案 1 :(得分:0)
最后很简单:我只需要删除方法上方的[HttpPost]标签和[HttpGet]方法,因为最后它什么也没做。之后,它达到了我的断点,可以验证该值是否正常:)