См. Мой вопрос здесь Jquery, автозаполнение с использованием json, значения идентификатора vs против отображения
Мы фактически "позаимствовали" (прочитали, скопировали и вставили) автозаполнение javascript SO, а затем слегка доработали его - такойкак его переименование, чтобы оно не мешало автозаполнению jquery ui e.
Они на самом деле очень похожи, но мы хотели специально иметь систему тегов, такую как SO.
вы можете восстановить код, который я использовал http://pastebin.com/t29RCCZg
, и вот пример действия, которое мы использовали для тегов
public ActionResult ProfileTags(string prefix, int? limit)
{
if (!limit.HasValue)
limit = ConfigurationHelper.Paging.TagList;
if (String.IsNullOrEmpty(prefix))
prefix = String.Empty;
ProfileTagModel model = new ProfileTagModel()
{
Tags = profileTagRepository.GetList(new ProfileTagsByPrefixQuery(prefix)).OrderBy(x => x.Name).Take<ProfileTag>(limit.Value)
};
return View(model);
}
И вид выглядит так
<%@ Page Language="C#" ContentType="text/html" Inherits="System.Web.Mvc.ViewPage<ProfileTagModel>" %>
<% if(Model.Tags != null) { %>
<% foreach (ProfileTag tag in Model.Tags) { %>
<%= tag.Name + ((tag.ProfileCount > 0) ? " (" + tag.ProfileCount.ToString() + ")" : String.Empty) %>
<% } %>
<% } %>
И тогда наше использование на странице выглядит примерно так
$().ready(function () {
$("#ProfileTags").troppinautocomplete('<%= Url.Action("ProfileTags", "Filter") %>', {
max: 10,
highlightItem: true,
multiple: true,
multipleSeparator: " ",
matchContains: false,
scroll: true,
scrollHeight: 300,
dataType: "html"
});
})
Хотя вам не обязательно делать это таким образом.Вы можете заставить метод действия возвращать массив объектов в виде json, а затем, изменив способ объявления автозаполнения, можно фактически отформатировать теги для отображения со значком или другими функциями.
Вот пример, которыйвзял json для форматированного вида
$('#troppinSearch').troppinautocomplete(url, {
dataType: 'json',
parse: function (data) {
var rows = new Array();
if (data != null) {
for (var i = 0; i < data.length; i++) {
rows[i] = { data: data[i], value: data[i].Id, result: data[i].Title };
}
}
return rows;
},
formatItem: function (row, i, n) {
return '<table><tr><td valign="top"><img height="28" width="28" src="' + row.ImageUrl + '" /></td><td valign="top" style="padding:0px 0px 0px 6px;"><div>' + row.Title + '</div><div><small>' + row.ResultType + '</small></div></td></tr></table>';
},
formatResult: function (row, i, n) {
return row.Id;
},
width: 336,
max: 20,
highlightItem: true,
multiple: false,
matchContains: true,
scroll: true,
scrollHeight: 300
}).result(function (event, data, formatted) {
var type = data.ResultType.toLowerCase();
var id = data.Id;
if (type == "product") {
window.location.href = '/Shop/Product/' + id;
} else {
window.location.href = '/Profile/Index/' + id;
}
});
И действие выглядит так
public ActionResult Search(string contentType, string prefix, int? limit)
{
if (!limit.HasValue)
limit = ConfigurationHelper.Paging.ProfileList;
SearchResponse response = GetSearchResults(contentType, prefix);
var dropDownResults = (from r in response.Results
select new
{
Id = r.Id,
Title = r.Name,
ImageUrl = r.DefaultImage,
ResultType = r.ResultType.ToString()
}).Distinct().Take(limit.Value);
return Json(dropDownResults.ToList(), JsonRequestBehavior.AllowGet);
}
Когда вы делаете это таким образом, вам не нужно представление.Автозаполнение принимает данные json и делает все магическим образом.Функция .Result в конце позволяет вам настроить событие, которое происходит при выборе.в этом случае он фактически отправляет пользователя на другую страницу, но мы использовали его для установки значения в скрытом поле.
РЕДАКТИРОВАТЬ
Я забыл встроенныйCSS классы для этого кода.Вот пример CSS.
.ac_results{
padding:0;
border:1px solid #4c4c4c;
background-color:#ffffff;
overflow:hidden;
z-index:99999;
text-align:left;
font-size: 14px; line-height:14px;
color: #333333;
}
.ac_highlight{
font-weight:bold;
text-decoration:underline;
background-color: #ff6600;
color: #ffffff;
}
.ac_results ul{
width:100%;
list-style-position:outside;
list-style:none;
padding:0;
margin:0;
}
.ac_results li{
margin:0;
padding:3px 6px 3px 6px;
cursor:default;
display:block;
line-height:14px;
overflow:hidden;
}
.ac_loading{
background:#fff url(/Content/images/loading.gif) right center no-repeat;
}
.ac_over{
background-color:#ff6600;
color:#ffffff;
}