Ich versuche, ein AutoComplete-Textfeld zu erstellen, während Sie eine verwenden. Das Problem, das ich gegenüberstelle, ist, dass mit der Html.BeginCollectionItem()
Extension-Lösung (https://www.nuget.org/packages/BeginCollectionItem/), die IDs der EditorFor()
und TextBoxFor()
Methoden dynamisch gesetzt werden und das bricht mein Javascript. Darüber hinaus weiß ich nicht genau, ob das überhaupt möglich ist (und wenn ja, wie. Im Folgenden finden Sie, wie weit ich gekommen bin).MVC AutoComplete EditorFor während der Verwendung von Html.BeginCollectionItem
in der Hauptansicht I eine Schleife eine Teilansicht für jedes Element in einer Sammlung
for (int i = 0; i < Model.VoedingCollection.Count; i++)
{
@Html.EditorFor(x => x.VoedingCollection[i], "CreateVoedingTemplate")
}
die Teilansicht CreateVoedingTemplate.cshtml
verwendet die Html.BeginCollectionItem()
Methode
@using (Html.BeginCollectionItem("VoedingCollection"))
{
string uniqueId = ViewData.TemplateInfo.HtmlFieldPrefix.Replace('[', '_').Replace(']', '_').ToString();
string searchId = "Search_";
string standaardVoedingId = "StandaardVoeding_";
foreach (KeyValuePair<string, object> item in ViewData)
{
if (item.Key == "Count")
{
searchId = searchId + item.Value.ToString();
standaardVoedingId = standaardVoedingId + item.Value.ToString();
}
}
<div class="form-horizontal">
<div class="form-group" [email protected]>
@Html.LabelFor(model => model.fk_standaardVoedingId, "Voeding naam", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.HiddenFor(model => model.fk_standaardVoedingId)
<input type="text" id='@searchId' placeholder="Search for a product"/>
</div>
</div>
</div>
<script type="text/javascript">
var id = '@uniqueId' + '_fk_standaardVoedingId'.toString();
var search = '@searchId'.toString();
var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "AgendaApi" })';
$(document.getElementById(search)).autocomplete({
source: function (request, response) {
$.ajax({
url: url,
data: { query: request.term },
dataType: 'json',
type: 'GET',
success: function (data) {
response($.map(data, function (item) {
return {
label: item.standaardVoedingNaam,
value: item.standaardVoedingId
}
}));
}
})
},
select: function (event, ui) {
$(document.getElementById(search)).val(ui.item.label);
//$('#id').val(ui.item.value);
document.getElementById(id).value = ui.item.value;
return false;
},
minLength: 1
});
</script>
}
<link href="~/Content/SearchBox/jquery-ui.css" rel="stylesheet" />
<script src="~/Scripts/SearchBox/jquery-1.9.1.js"></script>
<script src="~/Scripts/SearchBox/jquery-ui.js"></script>
Im Skript
oben zu erzeugen, Ich versuche, eine Funktion zu machen, wo der Benutzer den Namen einesstandaardVoeding
Elements eingeben und dann Ergebnisse erhalten kann, wo, nachdem der Benutzer ein
standaardVoeding
Element auswählt, die
standaardVoedingId
Eigenschaft erhält einstellen. Dann, nachdem das gesamte Formular einreichen, der Regler die
standaardVoedingId
empfängt (mit allen anderen Informationen auch)
Also ich denke, Javascript irgendwie nicht den Razor Ansicht @
Code verarbeiten kann, und daneben, tut Html.BeginCollectionItem
etwas faul, weil Sie kann den Wert seiner Textfelder über den Code zur Laufzeit nicht setzen. Daneben habe ich versucht, alert(document.getElementById(*html.begincollectionitemId*))
zu tun, und es findet die Felder gut. Aber anscheinend funktionieren alle anderen Methoden nicht?
Gibt es vielleicht eine bessere Lösung, um dies zum Laufen zu bringen?
Entschuldigung! Was genau ist das Problem, vor dem Sie stehen? – Shyju
Verwenden Sie einfach einen Klassennamen, um das Plugin anzuhängen (keine ID-Attribute) –
Das Problem, mit dem ich konfrontiert bin, ist, dass mit dem hier geschriebenen Code die Aktion nicht an den Controller gesendet wird. Wie kann ich die Daten binden, die ich zurückbekomme, wenn ich den Wert eines Html.BeginCollectionItem-Feldes durch Javascript scheinbar nicht einstellen kann? Also, im Grunde möchte ich ein Autocomplete-Formular, das einen Wert zurückgibt und diesen Wert an eine Eigenschaft eines Modells bindet. – DaGrooveNL