0

ここで説明するように、Webサイトでパスワードを紛失した場合のキャプチャコントロールを実装しています

しかし、私は`に非常に不快感を覚えます

filterContext.ActionParameters ["captchaValid"] = recaptchaResponse.IsValid;

なぜなら:

  • バリデーターを使用して、強く型付けされたビューがあります
  • この文字列フィールドを覚えずにプロパティ名を変更する日は、機能しません。

そこで、コントローラーアクションにこのデータが必要になるため、、ActionFilterAttributeのモデルの属性を編集する方法を検索しました。OnActionExecutingこれを見つけましが、アクションを実行する前にモデルを設定する必要があるため、機能しません。

そこで、モデルバインダーが読み取る「Post変数」を追加できると思いましたfilterContext.HttpContext.Request.Formが、読み取り専用モードのようです。

では、どのようにして結果をモデルに入れることができると思いますか?

例えば:MyModel.IsCaptchaValid = recaptchaResponse.IsValid;

プロパティフィールドを指定することを避けられない場合のイベント、それは今よりも良いです:

filterContext.Something.Else["ModelKey"] = recaptchaResponse.IsValid;;
4

2 に答える 2

2

ModelStateにエラーを追加するのはどうですか?

filterContext.Controller.ViewData.ModelState.AddModelError("", ""Captcha response invalid")

次に、アクションでModelState.IsValidを確認できます(とにかく実行する必要があります)

于 2012-03-21T11:04:46.550 に答える
0

この文字列フィールドを覚えずにプロパティ名を変更する日は、機能しません。

プロパティ/文字列名の変更によって機能が損なわれることが心配な場合は、カスタム属性を単体テストできます。

public void CaptchaValidatorAttribute_SetsActionParameter_ForCaptchaValidity()
{
    // arrange
    var filterContext = new ActionExecutingContext
    {
        ActionParameters = new Dictionary<string, object>()
        // ... other arrangements, like mocking HttpContextBase and HttpRequestBase
    };
    var actionFilter = new CaptchaValidatorAttribute();

    // act
    actionFilter.OnActionExecuting(filterContext);

    // assert
    Assert.AreEqual(filterContext.ActionParameters.ContainsKey("captchaValid"), 
        true);
}
于 2012-03-21T11:33:20.707 に答える