2016-09-02 166 views
0

如果複選框被選中,我在視圖中有一個數量字段。ASP.NET MVC5客戶端驗證

一旦Razor呈現View with Model數據,並且用戶選中沒有輸入相應金額的複選框。顯示驗證消息。如果我取消選中該複選框,驗證消息不會消失。我試過使用jquery刪除所有生成的規則,但如果用戶再次複選框,在回發之前,這些驗證規則將被刪除(除非我存儲它們...這是得到真的很難看。)

是否有一種可接受的方式來重新驗證客戶端與MVC模型中的相同要求?

型號:

[Display(Name = "Include Amount")] 
public bool IncludeAmount { get; set; } 
[Display(Name = "Amount")] 
[RequiredIf("IncludeAmount", TargetValue = true, ErrorMessage = "Amount is required.")] 
[MaxDigits(10, 2)] 
[RegularExpression(RegularExpressions.Money, ErrorMessage = ErrorMessages.NumericValueInvalidFormat)] 
[GreaterThanZero] 
public Nullable<decimal> Amount { get; set; } 

查看:

<td class="dataEntryLabel" colspan="2"> 
    @Html.LabelFor(model => model.IncludeAmount) 
</td> 
<td class="dataEntryField" colspan="2"> 
    @Html.CheckBoxFor(model => model.IncludeAmount, new { id = "IncludeAmount" }) 
    <span class="dollar-sign">@Html.TextBoxFor(model => model.Amount, "{0:F}", new { id = "Amount", disabled = "disabled" })</span> 
    @Html.ValidationMessageFor(model => model.Amount) 
</td> 

的JavaScript(客戶端):

function fixUnobtrusiveValidations() { 
    var form = getForm(); 
    (<any>$).validator.unobtrusive.parse(form); 
} 

function onClickCheckBoxIncludeAmount(){ 
     fixUnobtrusiveValidations(); 
} 

$('IncludeAmount').click(onClickCheckBoxIncludeAmount); 
+0

試試這個https://code.msdn.microsoft.com/Flexible-Conditional-37ae638e/sourcecode ?fileId = 65995&pathId = 91939366 下面是一些解釋https://blogs.msdn.microsoft.com/stuartleeks/ 2012/09/07/flexible-conditional-validation-with-asp-net-mvc-adding-client-side-support/ –

+0

你爲自定義屬性使用了哪個插件(或者你擁有這些插件?)。沒有理由重新分析驗證器。並且不要設置'id'屬性 - 你只需要覆蓋'HtmlHelper'方法生成的ID –

回答

0

這工作:

if (!($('#IncludeAmount').checked)){ 
 
    toggleValidatorVisibility($('#Amount'), false); 
 
} 
 

 
function toggleValidatorVisibility(element: any, value) { 
 
    var td: any = element.closest('td'); 
 
    if (value) { 
 
     td.find('span.field-validation-error').show(); 
 
    } else { 
 
     td.find('span.field-validation-error').empty(); 
 
    } 
 
}