18

我有一个RangeValidator在我的模型属性只允许整数介于0和100之间。我有一个局部视图,显示一个表单通过jQuery UI对话框更新属性。我查看了源代码并可以确认正在生成数据注释属性。但是,验证工作不正常。它确实执行某种验证,但它没有使用我设置的范围。值1,10和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,如果我改变我的TextBoxForEditorFor它chnages到number但我仍然看到相同的行为。

+0

这是一个突破对jQuery的更改的问题,请参阅:http://stackoverflow.com/questions/14889431/client-side-validation-trips-on-dataannotation -range-attribute – felickz 2013-06-05 22:17:17

回答

7

我有这个确切的问题,并找到解决方案here。您需要升级以下:

jQuery验证(至少1.11.1)
微软jQuery的不显眼的验证(至少2.0.30116.0)
微软不显眼的jQuery阿贾克斯(至少2.0.30116.0)

这个问题是通过突破jQuery 1.9.1的变化而引入的

+0

这确实最终会成为问题,正如felickz在一段时间后指出的那样,但由于您是第一个将其作为正式答案提出来的人,所以我会给您一个信贷来标记它已解决。 – stopher 2013-07-17 20:43:56

+0

谢谢。我从这里开始并遵循felickz的链接...然后从那里到GitHub上的问题的链接...然后滚动到一个评论说,jQuery验证1.11.1修复它....所以我想我会让它对于后面的任何事情都会更容易 – Colin 2013-07-18 08:07:12

3

尝试[Range(0, 100)]。完全删除ErrorMessage以查看您没有破坏任何格式不正确和大括号。

如果纯粹的范围不能正常工作让力(MS)与你同在! :)

+0

完成。同样的错误。从模型中删除了所有其他属性,删除了'Required'注释,将'Range'更改为您在此处的内容。我甚至采取了这种形式,并将其从“部分”视图中移出,并使其不再是对话框。同样的错误。然后我将数据注释从等式中删除。我将标记直接生成并插入到页面中,而不是从模型中生成。同样的错误。 – stopher 2013-03-13 13:41:59

+1

在这个时候,你需要*力*与你在一起:) 我会开始注释掉你的部分代码来隔离问题。因为'Range'一路工作,所以没有问题,我认为这可能是一些冲突或版本不匹配,但我不希望论坛上的人员会为您远程调试此事。只要隔离问题。其他行为方式(如果你还没有太多的代码)将只是创建新的解决方案,并通过检查每一次你带来一些'Range'仍然有效的新东西来移动你的代码。希望这可以帮助。 – 2013-03-13 13:57:20

+1

我真的很感谢你的帮助,但我决定只是为了踢,并使用RegularExpression验证器,而这在我的情况下也是可行的。我花了太多时间。我想MS赢得这轮... – stopher 2013-03-13 15:01:11