我有一个使用新的 MVC5 RouteAttribute 的路由定义,看起来像这样-
[HttpGet]
[AllowAnonymous, Route("Account/ResetPassword/{user}/{token}", Name = "ResetPasswordForm")]
public async Task<ActionResult> ResetPassword(int user, string token)
这会加载一个视图,该视图包含一个允许用户提供新密码和确认密码的表单,并且还将密码重置令牌和用户 ID 值作为隐藏字段提交。可以通过以下 URL 访问视图 -
http://www.domain.com/Account/ResetPassword/2/0tLb2N1eVc3a2dHMkxqNVlX.....
使用视图代码-
@using (Html.BeginForm("ResetPassword", "Account", FormMethod.Post, new { role = "Form" }))
{
@Html.AntiForgeryToken()
<h2>Enter a new password below</h2>
<hr />
@Html.HiddenFor(m => m.User)
@Html.HiddenFor(m => m.Token)
<div class="form-group">
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password)
</div>
<div class="form-group">
@Html.LabelFor(m => m.ConfirmPassword)
@Html.PasswordFor(m => m.ConfirmPassword)
</div>
@Html.ValidationSummary(true, "", new { role = "status" })
<div class="form-actions">
<input type="submit" value="Reset password" class="ui-button" />
</div>
}
提供了定义的动作和控制器后,我希望看到 URL -
/帐户/重置密码/
对于表单操作。我看到的不是这个——
/帐户/重置密码/2/0tLb2N1eVc3a2dHMkxqNVlX.....
POST 控制器操作定义如下所示 -
[HttpPost]
public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model)
{
额外的路由参数导致 POST 请求失败并返回 404。
我尝试在 BeginForm 方法中提供“null”作为路由值参数,或者专门将“user”和“token”设置为空字符串,但在所有情况下都保留了原始 GET 参数。我发现的唯一解决方法是完全更改 POST 操作的名称,在这种情况下,它会按预期呈现 -
<form role="Form" action="/Account/ResetUserPassword" method="post">
有没有办法可以为 POST 操作保留相同的操作名称,但不让 BeginForm 方法附加我不需要的额外参数?如有必要,我准备将其明确写为表单元素,但是有没有办法使用内置方法来实现这一点?如果没有别的,为了一致性。