改寫jquery.validate.unobtrusive.js實現氣泡提示mvc錯誤


個人對於這個js、css不是很擅長,所以這個氣泡提醒的樣式網上找了下,用了這個http://www.cnblogs.com/wifi/articles/2918950.html當中的第一種寫法。

對於mvc中默認的錯誤提示,是使用@Html.ValidationMessageFor這個來生成個<span class="field-validation-valid" data-valmsg-for="XXX" data-valmsg-replace="true"></span>這種的html標簽,但是對於span首先它得占頁面的空間,而且我需要它里面有字的時候才顯示,沒字的時候就得隱藏,css不好弄,所以就得改這個jquery.validate.unobtrusive.js來實現。

(當然mvc中錯誤提示還有@Html.ValidationSummary,不過這個我發現它都是頁面回發的時候才會變化的,所以我可以在頁面load出來的時候就能夠判斷到里面有沒有文字,然后再去控制如何顯示出來,這個實現起來就比較簡單,也不用去改動源碼啥的,這里就不提了。)

我改的jquery.validate.unobtrusive.js中的onerror方法:

 1     function CPos(left, top) {
 2         this.left = left;
 3         this.top = top;
 4     }
 5 
 6     function GetObjPos(ATarget) {
 7         var target = ATarget;
 8         var pos = new CPos(target.offsetLeft, target.offsetTop);
 9 
10         var target = target.offsetParent;
11         while (target) {
12             pos.left += target.offsetLeft;
13             pos.top += target.offsetTop;
14 
15             target = target.offsetParent
16         }
17         return pos;
18     }
19 
20     function onError(error, inputElement) {  // 'this' is the form element
21         var container = $(this).find("[data-valmsg-for='" + inputElement[0].name + "']"),
22             replace = $.parseJSON(container.attr("data-valmsg-replace")) !== false;
23 
24         container.removeClass("field-validation-valid").addClass("field-validation-error");
25         error.data("unobtrusiveContainer", container);
26 
27         var pos = GetObjPos(inputElement[0]);
28         if (error.text().length > 0) {
29             if ($("[popupfor='" + inputElement[0].name + "']").length == 0) {
30                 $(document.body).append("<div class=\"poptip\" popupfor=\"" + inputElement[0].name + "\" style=\"top: " + (pos.top + inputElement.height()) + "px;left:" + pos.left + "px;\"><span class=\"poptip-arrow poptip-arrow-top\"><em>◆</em><i>◆</i></span>" + error.text() + "</div>");
31             }
32             else {
33                 $("[popupfor='" + inputElement[0].name + "']").contents().filter(function () {
34                     return this.nodeType == 3;
35                 }).replaceWith(error.text());
36             }
37             $("div[popupfor='" + inputElement[0].name + "']").show();
38         }
39         else {
40             $("div[popupfor='" + inputElement[0].name + "']").hide();
41         }
42 
43         if (replace) {
44             container.empty();
45             error.removeClass("input-validation-error").appendTo(container);
46         }
47         else {
48             error.hide();
49         }
50     }

 

紅色的是我加的,代碼比較簡單。

然后cshtml中我使用了個隱藏的div,把這個@Html.ValidationMessageFor給包起來。

.hide {display:none;}

<div class="hide">@Html.ValidationMessageFor(model => model.XXX)</div>

效果圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM