次のような新しい 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 メソッドに必要のない余分なパラメーターを追加させない方法はありますか? 必要に応じてこれをフォーム要素として明示的に書き出す準備ができていますが、組み込みメソッドを使用してこれを達成する方法はありますか? 他に何もない場合でも、一貫性のために。