5

ValidationController アクションがトリガーされない理由を突き止めようと、私は頭を悩ませてきました。

プロジェクト全体の web.config で設定を有効にしています。

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

私は次のコントローラーを持っています:

[OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
public class ValidationController : Controller
{
    private readonly IUserRepository userRepository;

    public ValidationController(IUserRepository userRepository)
    {
        this.userRepository = userRepository;
    }

    public JsonResult IsUserNameAvailable(string username)
    {
        User user = userRepository.Get(u => u.UserName == username);

        if (user == null) return Json(true, JsonRequestBehavior.AllowGet);
        else return Json(false, JsonRequestBehavior.AllowGet);
    }
}

および次のビューモデル:

    [Required(ErrorMessage = "Required *")]
    [StringLength(50, MinimumLength = 4, ErrorMessage = "Please keep the username between four and twenty character.")]
    [Remote("IsUserNameAvailable", "Validation", ErrorMessage = "A user with this username already exists.")]
    [Display(Name = "Username")]
    public string UserName { get; set; }

そして、フォームに次のフィールドがあります。

<form id="registerForm">
     ...
     @Html.ValidationMessageFor(m => m.UserName)
     @Html.TextBoxFor(m => m.UserName)
     @Html.LabelFor(m => m.UserName)
</form>

私は ajax フォームの送信を行っており、サーバー側の検証は完全に機能しています。

$.post("/Account/Register", $('#registerForm').serialize(), function(){
   updateFormWithServerGeneratedErrors();
})

サーバーは私のフィールドに正しい入力タグを生成しましたが:

<input ... data-val-remote-url="/Validation/IsUserNameAvailable" data-val-remote-additionalfields="*.UserName" data-val-remote="A user with this username already exists." ... >

「/Validation/IsUserNameAvailable?username=SomeName」という URL に入力して手動でアクションを実行できますが、Fiddler は、キーを押したりフォーカスを変更したりしたときに、この URL に対して行われたリクエストを表示しません。

このチュートリアルによると、これを機能させるために JavaScript を記述する必要はありません。はい、フォームをいじり始めるまでに、jquery.validate.js および jquery.validate.unobtrusive.js スクリプトが既に読み込まれています。

ここで何が問題なのですか?

4

5 に答える 5

5

わかりました私は私の答えを見つけました。

ここでダリン・ディミトロフを引用するには:

「目立たない検証は、DOM に動的に追加された要素ではそのままでは機能しません。たとえば、AJAX リクエストをサーバーに送信して部分ビューを返し、この部分ビューを DOM に挿入するなどです。

機能させるには、新しく追加された要素を目立たない検証フレームワークに登録する必要があります。これを行うには、新しく追加された要素で $.validator.unobtrusive.parse を呼び出す必要があります。このコードは、パーシャルを DOM に挿入する AJAX 成功ハンドラー内に配置する必要があります。」

フレームワークは、ページの読み込み時にこのメソッドを 1 回呼び出します。私のシナリオの問題は、フォーム自体が jquery ダイアログであり、最初の読み込みでさえ「動的」であったことです。ダイアログの読み込み時に控えめなフレームワークにフォーム要素を登録する必要がありました。

$.validator.unobtrusive.parse('#registerForm');  

サーバー側で検証されなかった場合、私の ajax 呼び出しも次のようにフォームを返し、置き換えます。

registerDialog.empty().html(result.viewResult);

そのため、成功のコールバックでも parse() を呼び出して、ajax 送信後に検証が引き続き機能するようにする必要がありました。

于 2013-01-06T18:05:18.620 に答える
2

JsonResult メソッドのパラメーター名を次のように変更する必要があります。

public JsonResult IsUserNameAvailable(string username)

public JsonResult IsUserNameAvailable(string UserName)

大文字と小文字が区別されるプロパティ名と同じである必要があります。

于 2016-06-01T13:52:20.840 に答える
1

検証関数が起動されない問題は、このコードが

public JsonResult IsUserNameAvailable(string username)
{
    User user = userRepository.Get(u => u.UserName == username);

    if (user == null) return Json(true, JsonRequestBehavior.AllowGet);
    else return Json(false, JsonRequestBehavior.AllowGet);
}

AccountControllerではなくに追加する必要がありValidationControllerます。クラスを削除し、メソッドをValidationControllerクラスに追加します。IsUserNameAvailableAccountController

また、モデルの行を変更すると、次のようになります

[System.Web.Mvc.Remote("IsUserNameAvailable", "Account")]

これで問題は解決します。

于 2012-12-30T03:56:02.257 に答える
0

フォームのバインディングアクションを指定するのを忘れているようです。私はこれを以下のコードで試しましたが、うまくいきます

<form id="registerForm" action="Controller/Action">
     @Html.ValidationMessageFor(m => m.UserName)
     @Html.TextBoxFor(m => m.UserName)
     @Html.LabelFor(m => m.UserName)
</form>

または単に:

@using(Html.BeginForm()) {
     @Html.ValidationMessageFor(m => m.UserName)
     @Html.TextBoxFor(m => m.UserName)
     @Html.LabelFor(m => m.UserName)
}
于 2013-01-03T03:29:33.030 に答える
0

私は同じ問題を抱えていました。これを変更するだけです:

public JsonResult IsUserNameAvailable(string username)
{
    User user = userRepository.Get(u => u.UserName == username);

    if (user == null) return Json(true, JsonRequestBehavior.AllowGet);
    else return Json(false, JsonRequestBehavior.AllowGet);
}

に:

public JsonResult IsUserNameAvailable(string Username)
{
    User user = userRepository.Get(u => u.UserName == Username);
    if (user == null) 
    {
        return Json(true, JsonRequestBehavior.AllowGet);
    }
    return Json(false, JsonRequestBehavior.AllowGet);       
}

usernameUserNameあなたはどちらに

public string UserName { get; set; }

大文字と小文字を区別すると思います。

それが役立つことを願っています:)

于 2014-03-19T15:41:15.730 に答える