1

サイトには jquery .dialog で表示される多数のフォームがあり、ajax ポスト リクエストを使用して送信します。

私はかなりの調査を行いましたが、ajax リクエストの結果としてサーバー側から検証エラーを返す方法について明確なパターンはありません。

私が見つけたほとんどの唯一のパターンは、フォームを投稿してからサーバー側で検証を行い、どちらの場合も結果をカプセル化したjsonオブジェクトを返し、結果が正しくない場合はフォームhtmlを返すことでした

すなわち。

{result: true}
{success: false, html =  "<form>....</form>"}

したがって、結果が false の場合は、古いフォームを検証エラーのある新しいフォームに置き換えるため、フォーム上の項目に関連付けられたイベントを再配線する必要があります。

これは問題のないアプローチのように思えますが、実際には検証メッセージのみが必要であり、フォームを再配線する必要がある場合に必要なデータをクライアントに返す可能性もあり、これは少し面倒です。

何らかの方法で検証エラーを取得し、アクションからjsonオブジェクトでそれらを返し、クライアントに正しいフィールドに対してそれらを表示するように指示するという別の言及を見つけました。

これを簡単にするフレームワークはありますか、それとも自分で作成するか、フォームのパーシャル全体を返し、検証が正しくない場合に再配線することに固執する必要がありますか?

4

1 に答える 1

2

この特定のケースを処理するフレームワークはわかりません。また、明確なベストプラクティスがあるかどうかもわかりませんが、検証エラーをシリアル化してJSONオブジェクトとして返すのは簡単です。ModelStateDictionaryでこの拡張メソッドを試すことができます。

public static IEnumerable<ValidationResult> GetValidationResults(this ModelStateDictionary dictionary)
{
    foreach (var key in dictionary.Keys)
        foreach (var error in dictionary[key].Errors)
            if (error != null)
                yield return new ValidationResult(error.ErrorMessage, new string[] { key });
}

そしてコントローラーで:

if (!ModelState.IsValid)
{
    return new JsonResult(ModelState.GetValidationResults());
}

しかし、その通りです。次に、オブジェクトをループして、エラーを正しいフィールドに追加する必要があります。ClientValidationEnabledとUnobtrusiveJavaScriptEnabledをtrueに設定している場合、ループは次のようになります。

$.each(errors, function(i, item) {
    $('span[data-valmsg-for=' + item.MemberNames[0] + ']').html(item.ErrorMessage);
})

そうでない場合、オブジェクトにはフィールド名が含まれているため、エラーメッセージをそれぞれのフィールドに一致させることはそれほど難しくありません。これにより、ネットワーク全体でデータを確実に節約できますが、検証責任の大部分をJavascriptに移します。私が言ったように、明確なベストプラクティスがあるかどうかはわかりませんが、過去にこの方法を使用して成功しました。

于 2012-11-21T14:37:56.667 に答える