我有一個包含位置列表的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>