2012-02-16 88 views
17

我一直在使用KnockoutJS,KnockoutJS Mapping插件和jQuery 1.7.1構建使用ASP.NET MVC 2的頁面。我希望能夠使用KnockoutJS驗證插件(找到here)。不過,我需要同時進行服務器端和客戶端驗證。將視圖模型映射到KnockoutJS驗證

是否有可能讓我的視圖模型映射到使用.extend()方法的KnockoutJS Validation plugin

編輯:例子。自動關閉此:

[Required] 
public string Firstname { get; set; } 

進入這個:

var viewmodel = { 
    firstname: ko.observable().extend({ required: true }); 
} 
+0

您是否在您的C#模型上使用數據註釋並使用EditorFor填充客戶端驗證規則,或者您想要?您可以使用與MVC內置的相同的不顯眼的客戶端驗證,您可以使用標準MVC樣式表單而不需要太多工作(至少在具有Internet應用程序模板的MVC3中)。 – kendaleiv 2012-02-17 22:27:35

+0

請參閱我原來的編輯 – Ryan 2012-02-18 03:27:54

+0

這是一個非常有趣的方法,我給了它很多思考。我一直在考慮將行爲代碼從C#生成到Javascript。也就是說,我認爲你必須創建一些反映模型並生成javascript的東西。也許只是驗證部分,讓映射插件完成它的工作。映射和生成的驗證代碼的組合可以爲您提供所需的內容。我認爲你需要生成驗證代碼的原因是因爲我認爲你很難僅使用Javascript生成驗證代碼,但我可能是錯的。 – 2012-02-20 10:22:56

回答

7

Mvc Controls Toolkit我實現了一個引擎,可以在knockout.js.上啓用通常的Mvc驗證(數據註釋或其他)。可以啓用客戶端和服務器端驗證。此外,淘汰賽可以與Mvc助手一起使用,一些綁定自動推斷等。

+0

如果你可以通過使用MVC控件工具包來實現它,那就太好了。非常感謝 – Ian 2016-02-02 10:51:53

0

驗證插件,在您擴展您要驗證的觀測工作的方式。

無論它們是從映射創建的,只是創建一個函數,在映射完成後運行並添加所需的所有驗證。

或者,如果你想要的話,你可以使用驗證綁定。閱讀Github上的自述文件進行基因敲除驗證,並瞭解他們是如何做到的。

+0

請參閱原始問題中的編輯 – Ryan 2012-02-18 03:27:42

1

我建議使用內置的MVC客戶端驗證,則可能需要調用它,試試這個:

$.validator.unobtrusive.parse(yourFormElement) 

代碼來自:https://stackoverflow.com/a/5669575/941536

不知道是否有MVC2不顯眼的客戶端驗證,雖然,如果需要的話,不確定是否可以升級到MVC3。

+4

這不是驗證KnockoutJs的首選方法。你不想驗證表單元素。你想驗證視圖模型。 – 2012-02-20 10:14:20

+2

有沒有簡單的方法重用DataAnnotations或FluentValidator .Net代碼與Knockout驗證,並讓它驗證Knockout視圖模型?我寧願避免創建和維護兩組驗證規則,但如果Knockout視圖模型和.Net模型不匹配或者過於不相似,則這可能更加困難。 – kendaleiv 2012-02-25 06:32:24

+0

「這不是驗證KnockoutJs的首選方法」。爲什麼?驗證與用戶輸入連接,輸入元素通常映射到模型屬性。顯示未連接到輸入字段的錯誤消息,但顯示用戶不可見的某些模型屬性可能會使用戶很困惑。 – 2012-02-29 21:43:21

5

如果您使用的是knockoutjs和jquery,我想出了以下用於基本客戶端驗證的非常簡單的方法。

無論你想在頁面上顯示錯誤消息,包括span標籤是這樣的:

<span name="validationError" style="color:Red" 
data-bind="visible: yourValidationFunction(FieldNameToValidate())"> 
* Required. 
</span> 

顯然,你需要寫「yourValidationFunction」做任何你想做的事情。它只需返回true或false,true表示顯示錯誤。

如果顯示任何驗證錯誤,您可以使用jquery防止用戶繼續。你可能已經有一個保存按鈕觸發一個javascript函數做一些AJAX或什麼的,所以只包括本在它的頂部:

if ($("[name='validationError']:visible").length > 0) { 
     alert('Please correct all errors before continuing.'); 
     return; 
    } 

這是很多比許多其他驗證解決方案了更簡單,更靈活那裏。您可以將錯誤消息定位到任何地方,而無需學習如何使用某個驗證庫,並且此方法可以與服務器端技術無關。

+0

+1我喜歡你的解決方案的簡單性。我目前正在爲非必填字段和淘汰賽爭取jQuery valdiate,而你的回答指向了一個新的方向。 – 2013-02-08 16:17:26