删除POST提交的其他路由参数

时间:2014-02-24 12:04:55

标签: asp.net asp.net-mvc-5 asp.net-routing attributerouting

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

2 个答案:

答案 0 :(得分:1)

尝试为HTTP Post指定路由

 [HttpPost]
 [Route("Account/ResetPassword")]
 public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model)
 {

答案 1 :(得分:-3)

试试这个:添加到system.web

<sessionState cookieless="true" regenerateExpiredSessionId="true" />