2012-02-03 11 views
6

我有安裝Knockoutjs動態創建使用下面的代碼值的可編輯列表:如何獲取ModelState.AddModel錯誤以綁定到動態創建的驗證跨度?

 var requirementModel = function() { 
     var self = this; 
     self.requirementtypes = ko.observableArray(@Html.Interpret(Model.requirementtypes)); 
     self.requirementid = ko.observable(@Html.Interpret(Model.requirementid)); 
     self.AddRequirementType = function() { 
      self.requirementtypes.push({ 
       requirementtypeid: null, 
       number: "", 
       requirementid: 0 
      }); 
     }; 
     self.RemoveType = function(Type) { 
      self.requirementtypes.remove(Type); 
     }; 
     self.hookUpValidation = function() { 
      $.validator.unobtrusive.parseDynamicContent('.dynamicData'); 
     }; 
    }; 
    var viewModel = new requirementModel(); 
    ko.applyBindings(viewModel); 

的HTML:

<div class="small-box dynamicData" data-bind="template:{ name: 'requirementType-template', foreach: requirementtypes, afterRender:$root.hookUpValidation }" ></div> 
<button data-bind='click: AddType'>Add Type</button> 

我已經迷上了使用代碼動態數據驗證推薦上stackoverflow 。我可以做更復雜的驗證,如果失敗了,我可以使用ModelState.AddModelError(「輸入字段名稱」,「我可憐的傻瓜」這打破了這個「);這對非動態字段強類型或@ Html.ValidationMessage(「輸入字段名稱」)完美工作

但是,我找不到一種方法鉤住服務器端模型錯誤動態內容。

我有span標籤,與客戶端一起工作,他們完美的工作。但是,在服務器端驗證失敗並返回頁面之後,它們並未陷入返回的數據中。任何想法如何實現這一目標?

謝謝

+0

首選的方法是構建一個自定義ModelBinder,以將傳入的值綁定到您的模型並讓默認驗證機制引入。你的意思是你的模型是在客戶端生成的,而你沒有在服務器上定義它? – Aliostad 2012-02-03 12:23:16

+0

模型在服務器端定義。頁面的一部分使用knockoutjs將項目添加到列表中。我通過郵寄將所有內容都完美地恢復。動態數據全部發布。問題是如果我引發錯誤服務器端(例如複雜的驗證),然後返回到視圖,動態創建的項目引發的任何錯誤都沒有綁定。 – GraemeMiller 2012-02-03 12:25:58

+0

我在想我可能要訪問模型狀態,並將適當的錯誤添加到Knockout模型中,然後使用它。只是想知道是否有一個更優雅的方式(如我如何得到客戶端驗證) – GraemeMiller 2012-02-03 12:29:03

回答

4

我剛剛完成了編碼我目前的工作項目。我不能發佈守規則的代碼。就像你上面的評論所說,沒有一種優雅的方式。我將描述我們用來顯示錯誤消息的步驟。

首先,修改您的動態生成的html,以便每個都具有與MVC3 @ Html.ValidationFor(...)控件等效的代碼。接下來,每個動態控件都需要有一個id字段,您可以使用它來定位控件以添加錯誤消息。

步驟我拿了是,從控制器接收ajax的數據進行驗證後 -

  1. 驗證接收到的數據模型

  2. 創建一個類來返回,看起來像這樣

    結果
    Class AjaxResults{ 
        bool success {get; set;); 
        object returnedData {get; set;); 
    } 
    
  3. 如果型號驗證,則返回AjaxResults,其中success = true和returnedData =「驗證的數據模型」

  4. 如果模型沒有驗證然後

  5. 收集所有的錯誤變成對的列表。其中key = fieldID和value =「錯誤消息」。
  6. success =虛假和returnedData =

  7. 「錯誤清單」 客戶端後返回AjaxResults接收AjaxResults對象

  8. 如果success = TRUE,處理結果正常。

  9. 如果success = false,則遍歷列表,突出顯示帶有錯誤的字段並顯示錯誤消息。

在最後一步,您可以使用jquery驗證消息顯示錯誤代碼。如果你想這樣做,然後在jquery.unobtrusive.valiation.js文件

  1. 添加代碼以複製文件中的onError方法的功能。
  2. 添加代碼以通過調用onError方法顯示消息的錯誤列表進行交互。請注意,信息存儲在錯誤消息跨度的.data屬性中。
  3. 您可能需要編寫代碼以在提交表單時清除所有這些錯誤。

這是一個相當長的過程。但是代碼很容易模塊化爲可調用的例程。我們目前在我們的生產代碼中使用它,實際上,它成爲我們框架代碼的一部分。

希望這會有所幫助。

+0

感謝您的偉大答案。我會考慮這樣做。可惜它不夠優雅!我希望所有的驗證和動態數據一起播放更好一點。 – GraemeMiller 2012-02-07 00:09:35

+0

我剛剛偶然發現了這篇文章,它似乎提供了將mvc服務器端驗證連接到knockoutjs的更好的解決方案之一。我想跟進這個話題,看看這是否適合你,@GraemeMiller,或者如果你有麻煩。如果它運行良好,我想知道你是否可以爲此發佈更多的代碼示例。 – Dmitry 2012-09-24 08:31:07

+0

乍一看,我認爲[this](http://bojankaurin.github.io/knockout-server-side-validation/)完成了上述答案中描述的內容。 – bvgheluwe 2015-03-07 22:48:07

相關問題