我使用新的MVC5 RouteAttribute进行路由定义,如下所示 -
[HttpGet]
[AllowAnonymous, Route("Account/ResetPassword/{user}/{token}", Name = "ResetPasswordForm")]
public async Task<ActionResult> ResetPassword(int user, string token)
这会加载一个View,其中包含一个允许用户提供新密码和确认密码的表单,还会将密码重置令牌和用户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>
}
提供了一个定义的Action和Controller,我希望看到这个URL -
/帐户/ ResetPassword /
表单操作。而不是我看到 -
/帐户/ ResetPassword / 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方法追加我不需要的额外参数?如果有必要,我准备明确地将其作为表单元素写出来,但有没有办法使用内置方法实现这一点?为了保持一致,如果没有别的。
答案 0 :(得分:1)
尝试为HTTP Post指定路由
[HttpPost]
[Route("Account/ResetPassword")]
public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model)
{
答案 1 :(得分:-3)
试试这个:添加到system.web
<sessionState cookieless="true" regenerateExpiredSessionId="true" />