在 HTML 表单中,如何绑定 jquery 控件(例如 tokeninput),就像绑定普通原始类型到模型一样?我正在努力寻找方法来做到这一点,我知道你可以使用自定义模板等,但是 jquery 插件没有任何东西。
具体来说,我使用的是 tokenInput,请参见此处(http://loopj.com/jquery-tokeninput/)。这是我针对标准 HTML 文本输入应用的 jQuery 代码。对于每个按键,它都会转到控制器以返回作者列表。您还可以预填充作者,我使用 HTML5 中的数据标签来预填充控件。
$("#AUTHORs").tokenInput('/author/getauthors/', {
hintText: "Enter surname",
searchingText: "Searching...",
preventDuplicates: true,
allowCustomEntry: true,
highlightDuplicates: false,
tokenDelimiter: "*",
resultsLimit: 10,
theme: "facebook",
prePopulate: $('#AUTHORs').data('AUTHORs')
});
我从我的角度发布了一些代码,只是为了向您准确展示我试图绑定到模型的内容。
@model myModels.BOOK
@{
ViewBag.Title = "Edit";
}
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Basic</legend>
<div class="editor-label">
@Html.LabelFor(model => model.TITLE)
</div>
<div class="editor-field" >
@Html.EditorFor(model => model.TITLE)
@Html.ValidationMessageFor(model => model.TITLE)
</div>
<div class="authors">
<div class="editor-field">
<input type="text" id="authors" name="authors" data-val="true" data-val-required="You must enter at least one author" data-authors="@Json.Encode(Model.AUTHORs.Select(a => new { id = a.AUTHOR_ID, name = a.FULL_NAME }))"/>
<span class="field-validation-valid" data-valmsg-for="authors" data-valmsg-replace="true"></span>
</div>
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
这是我在表单上尝试更新模型(按“保存”后)时使用的代码:
[HttpPost]
public ActionResult Edit(BOOK book)
{
if (ModelState.IsValid)
{
db.Entry(book).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Details", new { id = book.REF_ID });
}
ViewBag.REF_ID = new SelectList(db.REFERENCEs, "REF_ID", "REF_ID", book.REF_ID);
return View(book);
}
当您查看 HTML 中的代码时,它已经从 tokeninput 元素中格式化了作者,看起来像这样,而且我认为这种格式似乎有一个真正的问题:
<input type="text" id="AUTHORs" name="AUTHORs" data-val="true" data-val-required="You must enter at least one author" data-authors="
[{"id":156787,"name":"Faure,M."},
{"id":177433,"name":"Wang,D.Z."},
{"id":177434,"name":"Shu,L.Sh"},
{"id":177435,"name":"Sheng,W.Z."}]"
style="display: none; ">