2011-04-21 89 views
44

在控制器中,我希望能夠獲得模型的客戶端驗證規則。我使用數據註釋附加了一些屬性,並希望能夠通過ajax調用將某些內容傳遞迴客戶端,以便我可以自動構建jquery驗證選項。Knockout + mvc 3 +驗證

正常情況下,這是免費的與不顯眼的東西,但我試圖利用淘汰賽的綁定,而不必複製服務器和客戶端上的驗證規則。

沒有在模型服務器端使用反射,我有點不確定如何實現這一點。

+0

您是否找到了可接受的解決方案?如果是這樣,請在這裏回答你自己的問題。 – 2011-09-29 21:26:25

+0

目前還沒有,轉移到另一個項目,但將返回。 – RubbleFord 2011-09-30 07:56:03

+0

請參閱:http://stackoverflow.com/questions/9878639/upshot-mvc-4-handling-of-date-knockout-bindings/9890429#9890429 – 2012-04-16 11:28:51

回答

0

這是一項相當艱鉅的任務。你希望能夠通過相應的數據類型轉換等將C#代碼轉換爲Javascript。你最好在服務器端和客戶端寫兩個單獨的驗證集合。與自己編寫自己的轉換框架並維護自己的轉換框架相比,維護它要容易得多

+0

我不認爲這很容易:-s – RubbleFord 2011-04-22 05:32:36

+0

可能有一小組標準驗證可以即時生成JS的類型(例如required,regex等);只有自定義的驗證器,你必須在客戶端和服務器上實現。 – namuol 2011-05-13 13:09:42

26

在我的Mvc Controls Toolkit中,我開發了基於knockout庫的Helpers。這些助手不僅可以幫助編寫淘汰賽代碼,還可以通過Unobtrusive驗證和全球化來增強淘汰賽庫。此外,綁定機制得到了增強,以包含諸如DatetimePicker等複雜控件以及其他「複雜」(由不同html部件製作)控件。

最後,敲除模板可以通過Razor助手定義。

請參閱文檔here,here,herehere。我也有一些教程,說明如何實現我的助手高級功能:

Low BandWidth Transfers with The Client Side Templates of the Mvc Controls Toolkit

Handling Big Amounts of Data with Client-Side Templates

Handling Big Amounts of Data with Client-Side Templates 2

+0

這很好,但我使用FluentValidation進行驗證,它更新了ModelState對象。當呈現視圖時,由FluentValidation框架生成的來自ModelState的錯誤將適當地應用於每個輸入。 MVC控件工具包是否查看模型狀態來確定哪些輸入需要突出顯示? – Dmitry 2012-10-11 20:05:17

+0

服務器端錯誤取自模型狀態,因此它們可以與使用模型狀態的任何技術一起使用......並且如果您將錯誤手動添加到模型狀態。 – 2012-10-12 15:07:38

+0

我會討厭三重驗證。驗證域模型,驗證視圖模型,現在是另一個庫......它的重複類型。應** **驗證,而不是3. – 2013-03-08 19:44:30

0

在模型中使用的屬性驗證,你喜歡:

public class ModelWithValidation 
{ 
    public int Id { get; set; } 

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

以mvc形式

@using(Html.BeginForm()) 
{  
    @Html.TextBoxFor(m => m.Name, new {data_bind = "value: name"}) 
    @Html.ValidationMessageFor(m => m.Name) 
} 

在jQuery測試中,如果表單是有效的onSubmit或在knockout保存函數中調用下一個代碼來驗證輸入。您必須包含jQuery.unobtrusive *和jQuery.validate *庫。不要忘記在服務器端驗證輸入!

var form = $("form"); 
form.removeData('validator'); 
form.removeData('unobtrusiveValidation'); 
$.validator.unobtrusive.parse(form); 

$("form").valid() //true false 
1

根據您確切需要做的事情,Breeze js可能是最佳解決方案。特別是,如果您使用EF,則可以在客戶端複製服務器EF DbContext的大部分功能,當然還包括驗證,還包括更改跟蹤.saveChanges,這是一種類似於LINQ查詢的簡單語法,緩存,序列化和反序列化以允許離線工作以及其他許多事情。

的基本步驟與微風JS工作是:

  • 在服務器
  • 創建一個EF模型在服務器上添加一個NuGet包來創建模型暴露在客戶端的Web API服務。這是在C#代碼數量驚人的情況下完成的。其中一件事就是公開元數據:對象,關係和額外信息的定義,如數據註釋驗證信息
  • 爲客戶端添加一個js Nuget包,這將用於複製EF上的EF行爲客戶端。

當然,並不是所有的服務器上的功能將在客戶端上覆制的,但你可以做很多事情:

  • 在客戶端
  • 化妝創造新的實體查詢客戶端,這將在服務器上執行並返回給客戶端
  • 修改客戶端上的實體:創建,修改,刪除...
  • 在客戶端創建關係:例如創建新的chlid實體在父對象在客戶端
  • 呼叫saveChanges,這將使得後臺更新,當然
  • 所有跟蹤的更改傳輸到服務器,而你這樣做,你會得到自動的客戶端驗證,並同時,只要你撥打.saveChanges

最後額外的服務器驗證,可以擴展和修改服務器代碼,包括一些業務邏輯,這樣就可以做比單純的EF模型暴露給客戶更多。