1

私はMVCにかなり慣れていないので、jQueryモーダルダイアログポップアップに移動することを除いて、インターネットアプリケーションテンプレートの既存の登録機能を使用したいプロジェクトです。

これが私の「新しいユーザー」ボタンのクリックイベントです。この質問の答えからアイデアを得ました:

$("#new-user").click(function () {

   $("#dialog-modal").empty(); // clear it out first
   $("#dialog-modal").dialog({
      height: 600,
      width: 500,
      title: "New User",
      modal: true,
      open: function (event, ui) {
         $(this).load("@Url.Action("Register")");
      },
      buttons: {
         "Add New User": function (e) {
            var $this = this;
            var form = $('form', $this);

            $.post("Account/Register", JSON.stringify($(form).serializeObject()), 
               function () {
                  $($this).dialog("close");
            });
          }
      }
   });
});

メソッドは次のUrl.Actionようになります。

[HttpGet]
public ActionResult Register()
{
   return View("_Register");
}

そして、私の_Register.cshtml View は、基本的にテンプレートからのもののコピーです:

@model MyProject.Models.RegisterModel
@{
    Layout = null;
    ViewBag.Title = "Register";
}

<hgroup class="title">
    <h1>@ViewBag.Title.</h1>
    <h2>Create a new account.</h2>
</hgroup>

@using (Html.BeginForm()) { 

    @Html.AntiForgeryToken()
    @Html.ValidationSummary()

    <fieldset>
        <legend>Registration Form</legend>
        <ol>
            <li>
                @Html.LabelFor(m => m.UserName)
                @Html.TextBoxFor(m => m.UserName)
            </li>
            <li>
                @Html.LabelFor(m => m.Password)
                @Html.PasswordFor(m => m.Password)
            </li>
            <li>
                @Html.LabelFor(m => m.ConfirmPassword)
                @Html.PasswordFor(m => m.ConfirmPassword)
            </li>
            <li>
                @Html.LabelFor(m => m.DisplayName)
                @Html.TextBoxFor(m => m.DisplayName)
            </li>
            <li>
                @Html.LabelFor(m => m.Email)
                @Html.TextBoxFor(m => m.Email)
            </li>
        </ol>
    </fieldset>
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

ここで、[新しいユーザーの追加] ボタンをクリックすると、インターネット アプリケーション テンプレートの組み込みアクション メソッドであるAccount/Registerにフォームがポストされていることがわかります。それはまったく変更されておらず、まだ飾られています:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]

ただし、[新しいユーザーの追加] をクリックしてフォームが投稿されるたびに、次の 500 エラー メッセージが表示されます (Fiddler で表示)。

必須の偽造防止フォーム フィールド「__RequestVerificationToken」が存在しません

1) 私のRegister.cshtmlビューにはまだ含まれており@Html.AntiForgeryToken()、2) その Javascript に足を踏み入れて の値を見ると、次のように表示されるため、なぜそれが存在しないのかJSON.stringify($(form).serializeObject()わかりません。

"{"__RequestVerificationToken":"X3APKURbjYGUYqY2qg1VdbYl50eVNzd7TJLYKCGC-awgkK7iNH_W6bVOw7C8zHDlygP0rVO2K4TLn5KE9CYsQN8VN1DbOOV0KzMGT7xso3o1","UserName":"theUserName","Password":"thePassword","ConfirmPassword":"thePassword","DisplayName":"theDisplayName","Email":"theEmail "}"

誰かが私が間違っていることを見ることができますか?

4

1 に答える 1

2

私たちのチャットに基づく

$(form).serialize()フォームのコントロールを受け取り、それらを JavaScript オブジェクトに変換します。次に、JSON.stringifyオブジェクト全体を文字列にラップしています。したがって、潜在的なペイロードは次のとおりです。

{
  "__RequestVerificationToken": "X3APKURbjYGUYqY2qg1VdbYl50eVNzd7TJLYKCGC-awgkK7iNH_W6bVOw7C8zHDlygP0rVO2K4TLn5KE9CYsQN8VN1DbOOV0KzMGT7xso3o1",
  "UserName": "theUserName",
  "Password": "thePassword",
  "ConfirmPassword": "thePassword",
  "DisplayName": "theDisplayName",
  "Email": "theEmail"
}

6 つの個別のパラメーターとして受信されるものは、1 つの大きな文字列にラップされ、現在は 1 つのパラメーターのみです。

アドバイス?を削除しJSON.stringify、通常どおり AJAX 呼び出しのみを渡します。次に、文字列としてマスクされるのではなくValidateAntiForgeryTokenAttribute、パラメーターが入ってくるのを確認できます。__RequestVerificationToken

于 2013-07-02T19:07:40.877 に答える