2011-03-30 57 views
2

我有一個包含位置列表的Telerik MVC ComboBox。客戶希望最終用戶能夠直接在列表中輸入新的位置。禁用MVC「必須是數字」字段的數據類型驗證

提交表單後,它應該接受一個新的值並插入到位置表中,當然還要更新要添加到新插入位置的ID的記錄的LocationID。

閱讀下面的代碼片段

我讀過的組合框不會讓你在不在列表中的數值輸入,以及所使用的演示(Here

代碼保存位置,編輯locationID不是問題。我的問題是,我的組合框包含一個整數/字符串值對列表,而不是字符串/字符串。因此,我在代碼中遇到的問題是,如果我嘗試提交新的位置名稱,它會嘗試驗證它並說它不是數字。

我需要一種方法來嘗試和壓制這種驗證,只是爲LocationID字段,但仍保護空值。

BEGIN EDITS

編輯:我沒有找到this post,但是作爲OP有說,JavaScript的黑客是不是很可擴展的,所以我真的想避免它。

編輯:

我結束了使用JavaScript的黑客,其所有我發現它的工作原理。我打算將它封裝在方法或屬性中,並將其作爲答案發布。

我發現用這個技巧,它沒有在Firefox或Chrome工作,如果我把代碼塊使用Telerik的()。ScriptRegistrar()的文檔準備事件裏面。OnDocumentReady()時,正確window.mvcClientValidationmetadata當它到達這個事件時不知何故被清除,儘管元數據最初被正確推入。

爲了解決這個問題,我不得不手動將代碼放在它自己的腳本塊中,正好在窗體關閉標記(這是客戶端驗證數組的呈現位置)下方。

END EDITS

此外,現在我直接綁定到我的模型,像這樣:

 public JsonResult Create(MyEntity Model) 

我不知道這是怎麼回事制定出當談到時間做模型綁定,我猜測它可能只是返回一個錯誤,我甚至不會達到我的操作方法代碼。

所以我想這裏的想法是在方法簽名中使用FormCollection,檢測非整數LocationID,插入更新,然後運行UpdateModel()?當然,歡迎提出更好的建議。

謝謝!

代碼段

型號:

class IntegerValueList 
{ 
    public Int16 ID { get; set; } 
    public string Name { get; set; } 
} 

     var lists = new Dictionary<string, IEnumerable<object>>(); 

     lists["Locations"] = (from record in db.Locations 
           orderby record.Name 
           select new IntegerValueList 
           { 
            ID = record.LocationID, 
            Name = record.Name 
           }).ToList(); 

控制器:

 LocationList = new SelectList(lists["Locations"], "ID", "Name", LocationID); 

查看:

   <td> 
        <div class="editor-field"> 
         <%: Html.Telerik().ComboBoxFor(model => model.LocationID) 
           .BindTo(Model.LocationList) 
           .Filterable(c => c.FilterMode(AutoCompleteFilterMode.Contains)) 
         %> 

         <%: Html.ValidationMessageFor(model => model.LocationID, "*") %> 
        </div> 
       </td> 

回答

0

當我不得不在過去這樣做的時候,我使用了一個帶有「Enter Location」標籤的字段的文本框,然後在下面有一個標籤,如「Or select ..」 。「,然後使用下拉列表的onChange事件來填充文本框。現在您不驗證下拉菜單。

您甚至可以在文本框旁邊放置一個「選擇」鏈接,並在點擊鏈接之前隱藏下拉框。缺點是我們最終可能會在聖地亞哥,聖地亞哥和桑地亞都進入地點列表......但是那麼您的客戶的要求不會讓我們明確地阻止這一點。

相關問題