2011-10-17 93 views
9

我有與它驗證一個隱藏字段如下客戶端驗證未在asp.net MVC工作隱藏字段3

@Html.HiddenFor(m => m.Rating) 
@Html.ValidationMessageFor(m => m.Rating) 

Rating屬性已Range validator屬性施加範圍爲1- 5。這是放在一個提交按鈕的形式。

我有那麼有以下jQuery的,設置在一些用戶事件中的隱藏字段中的值(上一些明星基本上用戶點擊率)

$(".star").click(function(){ 
    $("#Rating").val(2); 
}); 

現在,如果我提交表單而沒有設置用戶事件隱藏的領域,驗證工作。錯誤消息顯示正確,並且它適用於所有客戶端。

現在,在這種情況下,如果我點擊星星,調用上述javascript設置隱藏字段,那麼驗證錯誤消息就不會消失。我可以在隱藏變量具有一些有效值後提交表單。但我期望客戶端驗證應該可以工作。 (當隱藏變量已經設置了一些有效的值,驗證錯誤應該消失)

最初我想,jQuery的驗證將在一些特殊事件中被調用,所以我嘗試提高點擊,更改,鍵盤,模糊和我自己的聚焦事件如下

$(".star").click(function(){ 
    $("#Rating").val(2); 
    $("#Rating").change(); 
}); 

但是這仍然不起作用。錯誤信息一旦出現,根本不會消失。

回答

2

在其中設置隱藏字段的值的代碼,手動調用驗證的形式,像這樣:

$("form").validate().form(); 
+0

我不認爲你需要form以上聲明。 –

+0

爲了讓表單上的錯誤消息得到更新,'form()'是必需的。由於問題是關於即時更新錯誤消息,因此需要。 – counsellorben

+0

@counsellorben工作就像一個魅力 – Suhas

1

我認爲這是因爲隱藏的輸入不會觸發任何這些事件。

你可以做的是使用<input type="text" style="display:none" />而不是隱藏字段;

@html.TextBoxFor(m => m.Rating, new {display = "display:none"}) 
+0

這並不工作,要麼。我最好的猜測是,在設置隱藏變量之後,我需要提出一些JavaScript事件,例如更改/模糊,以再次啓用驗證。我不確定哪個事件是 – Suhas

+0

是的,對於隱藏文本框,您將激發.change()事件。我認爲對於隱藏的輸入,沒有默認的更改事件要附加到。 –

+0

不幸的是,這是行不通的。在設置隱藏文本框值後,我明確地觸發了更改事件。但驗證錯誤不會消失 – Suhas

5

你可以放的地方,但仍然是<form>內一個div包裹你的隱藏字段。添加CSS將其踢到外層空間。

<div style="position:absolute; top:-9999px; left:-9999px"> 
<input id="Rating" type="hidden" name="rating" > 
</div> 

然後將下面的標籤添加到您想要顯示的錯誤:

<label for="rating" class="error" style="display:none">I am an an error message, please modify me.</label> 
+0

我沒有更多的工作在這個項目上,所以沒辦法,我可以試試這個。但我喜歡這個建議,所以豎起大拇指:) – Suhas

+0

好主意,今天救了我的培根... –

+0

這個「是」解決方案。謝謝。 – Remotec

5

客戶端驗證忽略隱藏字段。你可以動態地設置「忽略」選項,但爲了讓它起作用,我直接在.js文件中做了以下操作。

現在這應該做的伎倆。

在我的aspx ...

<%: Html.HiddenFor(model => model.age, new { @class="formValidator" }) %> 

在jquery.validate.js

ignore: ":hidden:not('.formValidator')", 
5

事實證明,這是一個非常有趣的問題。默認的「忽略」設置忽略隱藏的字段。該字段隱藏在jQuery ui插件中。我只是增加了一個名爲「includeCheckBox」類來呈現的輸入我想驗證,並把下面的代碼行...

var validator = $('#formMyPita').validate(); 
validator.settings.ignore = ':hidden:not(".includeCheckBox")'; 
if ($('#formMyPita').valid()) {....