我想知道发布外键的最佳做法。
我有这个模型。
public class Country {
public int Id { get; set;}
public int Description { get; set;}
}
Public class City {
public int Id{get; set;}
public string Description{get; set;}
public Country Country {get; set;}
}
现在在我的城市视图中,我想要在第一次加载时不会加载所有国家/地区的下拉列表,但我想做某种自动完成,然后我看到了JQuery自动完成的方法,但我不知道如何在我的模型中绑定它。
有人可以给我一些建议吗?
答案 0 :(得分:6)
您需要在视图中提供的所有内容都是文本框,例如:
@Html.TextBoxFor(m => m.Country.Id, new { id="CountryId" })
在我继续前进之前,我假设您的Description
属性可能是Name
属性,并且使用英语,Description
表示{ {1}}有点误导。
使用JQuery,您需要做两件事,首先,您需要将自动填充功能附加到文本框中:
Name
$('#CountryId').autocomplete({
source: function(request, response) {
$.get('@Url.Action("GetCountries", "MyController")',
{ term: request.term },
function(data) {
response($.map(data, function (item) {
return {
label: item.Label,
value: item.Value
}
}));
});
},
minLength: 2
})
函数是一个自动完成回调函数,可执行一些操作docs for which are here。
当您有一个自动填充功能时,此方法有效,但如果您的网页上有多个自动填充功能,或者只想编写一个脚本以在您需要的每个输入上附加自动填充功能,you can use something similar to this:
response
使用这个JQuery:
@Html.TextBoxFor(m => m.Description, new {
data-autocomplete-url = @Url.Action("GetCountries", "MyController" })
最后,控制器中的操作方法:
$('*[data-autocomplete-url]')
.each(function () {
$(this).autocomplete({
source: function(request, response) {
$.get($(this).data("autocomplete-url"), ...);
});
});
其中public JsonResult GetCities(string term) {
var items = context.Cities
.Where(x => x.Description.Contains(term))
.Select(x => new { Label = x.Id, Value = x.Description })
.Take(10);
return Json(items, JsonRequestBehaviour.AllowGet);
}
是您的存储库。在您的情况下,我假设它是一个实体框架context
。 DbContext
方法将指示将多少值发送回客户端,保持此数字较低可能有助于自动完成的反应性,但不会为短搜索术语返回大的结果集。
如上所述,您应该尝试确保您的变量具有详细的名称。
One more source here that isn't directly relatable to what you're doing, but may come in handy.