我正在使用此autosuggest插件:http://aehlke.github.com/tag-it/
我从数据库中获取一系列项目(现在只是一个普通的数组)。该列表包括ID和标题。当我提交表单时,我想获得ID和标题。现在我只能得到Title。我想获得这两个值,以便可以创建新的引用(ID = 0),并且可以插入现有的引用而无需任何数据库查找。
这是我的代码。
book.aspx的代码隐藏 - book.aspx.cs:
...
protected void btnSave_Click(object sender, EventArgs e)
{
Response.Write(txtReferences.Text); // this contains Titles, but I would like both values.
}
public class Reference
{
public string Title;
public int ID;
}
[WebMethod]
public static Array GetReferences(string title)
{
// this will be replaced by lookup in database.
List<Reference> References = new List<Reference>{
new Reference{ID=1, Title="My ref 1"},
new Reference{ID=2, Title="Ref ref 2"},
new Reference{ID=3, Title="Blah ref 3"},
new Reference{ID=0, Title=title} // for new tags set ID 0 to indicate that this should be created in db
};
return References.ToArray();
}
....
这是我目前的剧本:
<script type="text/javascript">
$(document).ready(function () {
var failure = function (result) {
alert(result.status + " " + result.statusText);
}
var ref = $("#<%=txtReferences.ClientID %>");
ref.tagit({
allowSpaces: true,
removeConfirmation: true,
tagSource: function (title, showChoices) {
var params = '{"title":"' + title.term + '"}';
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
error: failure,
url: "book.aspx/GetReferences",
data: params,
success: function (data) {
var assigned = ref.tagit("assignedTags");
var filtered = [];
for (var i = 0; i < data.d.length; i++) {
if ($.inArray(data.d[i].Title, assigned) == -1) { filtered.push(data.d[i].Title); }
}
showChoices(filtered);
}
});
}
});
});
</script>
当然,我在book.aspx页面上有一个文本框:
<asp:TextBox ID="txtReferences" runat="server" />
欢迎任何帮助。感谢。
答案 0 :(得分:2)
在查看tag-it docs和sources之后,我担心这个插件不支持除简单字符串之外的任何内容作为标记,所以如果你想要发回更多信息,你必须自己做。假设Title
属性是唯一的(即没有两个标签具有相同的Title
但不同的ID
s),那么它应该不难...
您需要的第一件事是,在检索时,将Title
映射到ID
某处:
var ids = {}
...
for (var i = 0; i < data.d.length; i++) {
ids[data.d[i].Title] = data.d[i].ID;
if ($.inArray(data.d[i].Title, assigned) == -1) { ... }
}
现在你有很多选择。我的建议是使用隐藏字段,每次添加或删除标记时都会更新:
function updateHidden() {
var chosenTags = $.map(ref.tagit("assignedTags"), function(tag) {
return { Title:tag, ID:(ids[tag] || 0) }; // If the tag is new, use 0 as the ID
});
$("#<%=yourHiddenField.ClientID %>").val(JSON.stringify(chosenTags));
}
...
ref.tagit({
...
onTagAdded:updateHidden,
onTagRemoved:updateHidden
}
(注意:我建议使用JSON,但你可以使用任何更便于服务器处理的格式)
protected void btnSave_Click(object sender, EventArgs e)
{
Response.Write(yourHiddenField.Text); // this contains both values, encoded in JSON format.
}