18

モデル内のプロパティにRangeValidatorがあり、0〜100の整数しか使用できません。jQuery UIダイアログを使用してプロパティを更新するためのフォームを表示する部分ビューがあります。私はソースを見て、データ注釈属性が正しく生成されていることを確認できます。ただし、検証は正しく機能していません。何らかのバリデーションを実行しますが、設定している範囲を使用していません。値1,10、および100はエラーを生成しません。他の1桁または2桁の値はエラーを生成します。しかし、私が0で詰め込むと、100未満の値はすべて問題ありません。MVCデータアノテーションの範囲の検証が正しく機能しない

モデル:

public class MyModel 
{ 
    ... 
    [Required(ErrorMessage = "{0} is required")] 
    [Range(typeof(int), "0", "100", 
     ErrorMessage = "{0} can only be between {1} and {2}")] 
    public int Percentage { get; set; } 
    ... 
} 

部分図:

@model MyApp.Models.Partials.MyModel 

<div id="myDialog" class="editModal" title="Update Percentage"> 
    @using (Ajax.BeginForm("UpdatePercentage", "MyController", 
         new AjaxOptions() { HttpMethod = "Post", 
              OnSuccess = "onUpdateSuccess" }, 
         new { name = "myForm" })) 
    { 
    @Html.ValidationSummary(null, new { style = "width:auto;max-width:22em;    
               float:left;clear:both;" })  
    <div style="width:auto;float:left;clear:both;"> 
     <div style="width:10em;float: left;text-align:right;clear:left;"> 
     @Html.Label("Percentage:") 
     </div> 
     <div style="width:12em;margin-left:1em;float:left;clear:right;"> 
     @Html.TextBoxFor(m => m.Percentage) 
     </div> 
    </div> 
    <div style="width:23em;clear:both;text-align:center;"> 
     <hr /> 
     <input type="button" value="Cancel" class="cancelModalButton" 
      data-modal="myDialog" /> 
     <input type="submit" value="Submit" class="submitModalButton" 
      data-modal="myDialog" data-form="myForm" /> 
    </div> 
    } 
</div> 

生成マークアップ:

<div id="myDialog" class="editModal" title="Update Percentage"> 
    <form action="/Web/MyController/UpdatePercentage?Length=3" 
     data-ajax="true" data-ajax-method="Post" data-ajax-success="onUpdateSuccess" 
     id="form2" method="post" name="myForm"> 
    <div class="validation-summary-valid" data-valmsg-summary="true" 
     style="width:auto;max-width:22em;float:left;clear:both;"> 
     <ul> 
     <li style="display:none"></li> 
    </ul> 
    </div> 
    <div style="width:auto;float:left;clear:both;margin-bottom:.75em;"> 
     <div style="width:10em;float: left;text-align:right;clear:left;"> 
     <label for="Percentage:">Percentage:</label> 
     </div> 
     <div style="width:12em;margin-left:1em;float:left;clear:right;"> 
     <input data-val="true" data-val-number="The field Percentage must be a number." 
       data-val-range="Percentage can only be between 0 and 100" 
       data-val-range-max="100" data-val-range-min="0" 
       data-val-required="Percentage is required" id="Percentage" 
       name="Percentage" type="text" value="10" /> 
     </div> 
    </div> 
    <div style="width:23em;clear:both;text-align:center;"> 
     <hr /> 
     <input type="button" value="Cancel" class="cancelModalButton" data-modal="myDialog" /> 
     <input type="submit" value="Submit" class="submitModalButton" data-modal="myDialog" data-form="myForm" /> 
    </div> 
    </form> 
</div> 

私はタイプがtextに設定されていることを見て、私は私のTextBoxForを変更した場合EditorForそれはnumberに変わるが、私はまだ同じ動作を参照してください。

+0

これはjqueryの変更を壊す問題です。http://stackoverflow.com/questions/14889431/client-side-validation-trips-on-dataannotation -range-attribute – felickz

答えて

7

私はこの正確な問題を抱え、解決策を見つけましたhere

jQueryの検証(少なくとも1.11.1)
マイクロソフトのjQuery控えめな検証(少なくとも2.0.30116.0)
マイクロソフトのjQueryのAjax控えめな(少なくとも2.0.30116.0)

:あなたは、次のアップグレードする必要がありますこの問題は、jQuery 1.9.1の変更点を突破して導入されました。

+0

felickzさんがコメントとしてコメントしていたので、これが問題になってしまいました。しかし、公式の回答として最初に提案して以来、私はあなたにそれを解決済みとする印を付けます。 – stopher

+0

ありがとうございます。私はここから始めてfelickzのリンクをたどりました...そこからGitHubの問題へのリンクをたどりました...そして、jQuery Validation 1.11.1が修正したというコメントにスクロールしました。続くことに少しでも簡単に – Colin

3

Try [Range(0, 100)]ErrorMessageを完全に削除して、間違った書式と中括弧で何かを壊していないことを確認します。

純粋な範囲が適切に機能しない場合は、力(MS)をあなたと一緒にしてください! :)

+0

完了しました。同じエラー。モデルから他のすべてのプロパティを削除し、 'Required'アノテーションを削除し、' Range'をあなたがここにあるものに正確に変更しました。私はフォームを取って、それを 'Partial'ビューから移動し、もはやダイアログにしませんでした。同じエラー。次に、データアノテーションを式から外しました。モデルから生成する代わりに、ページに直接生成されてプラグインされていた入力に対してマークアップを使用しました。同じエラー。 – stopher

+1

現時点では、*あなたと一緒にいる*力が必要です:) 問題を特定するためにあなたのコードの一部をコメントアウトしています。 'Range'は一生懸命働いているので、問題はありません。いくつかの競合やバージョンの不一致があると思いますが、フォーラムの人々がリモートでこの問題をデバッグするとは思っていません。ただ問題を切り分けてください。他にも(まだあまりにも多くのコードを書いていないのであれば)新しいソリューションを作成して、そこにあなたのコードを移動して、 'Range'がまだ動作している何か新しいことを確認することになります。お役に立てれば。 –

+1

本当に助けていただきありがとうございますが、代わりにRegularExpressionバリデーターを使用してください。私はあまりにも多くの時間を費やしました。私はMSがこのラウンドを勝つと思います... – stopher

関連する問題