【问题标题】:Remove additional route parameters for POST submit删除 POST 提交的附加路由参数
【发布时间】:2014-03-26 02:05:36
【问题描述】:

我有一个使用新的 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 -

/帐户/重置密码/

对于表单操作。我看到的不是这个-

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

【问题讨论】:

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


    【解决方案1】:

    也尝试为 HTTP Post 指定路由

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

    【讨论】:

    • 在发布问题后,我实际上决定在午餐时步行去吃东西时尝试这个 - 我猜来自属性的路线比基于控制器和动作名称的隐式路线具有更高的优先级?无论如何,这非常有效,当之无愧的投票并接受我的感谢。这也是一个很好的提醒,让我把你的问题“从办公桌上移开”,因为通常你可以在一个新的视角下自己解决它。
    【解决方案2】:

    试试这个:添加到 system.web

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

    【讨论】:

    • 这是一个密码重置令牌,而不是无 cookie 会话 ID Jhoon。我将编辑问题以澄清这一点 - 抱歉,如果这还不清楚,我从上下文中假设它是显而易见的。
    猜你喜欢
    • 1970-01-01
    • 2018-04-05
    • 2012-01-29
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 2014-09-01
    相关资源
    最近更新 更多