0

我有一个使用新的 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 方法附加我不需要的额外参数?如有必要,我准备将其明确写为表单元素,但是有没有办法使用内置方法来实现这一点?如果没有别的,为了一致性。

4

2 回答 2

1

也尝试为 HTTP Post 指定一个路由

 [HttpPost]
 [Route("Account/ResetPassword")]
 public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model)
 {
于 2014-02-24T12:07:44.583 回答
-3

试试这个:添加到 system.web

<sessionState cookieless="true" regenerateExpiredSessionId="true" />
于 2014-02-24T12:21:59.370 回答