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>
}

定義済みの Action と Controller を提供したので、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 に答える