2015-08-24 10 views
5

Ich habe eine Reihe von Listenelementen, die ich dynamisch erstellen. Jedes dieser Listenelemente enthält einen Eingabetext, dessen Wert ich an den Controller übergeben möchte.Bindung zur Liste ASP.NET MVC dynamischen jQuery Index

HTML

<ul id="list"></ul> 
<button id="add">Add</button> 

<script> 
    var counter = 1; 

    $('#add').click(function() { 
     var text = '<input type="text" name="(what should I put here?)"></input>'; 
     var li = '<li>' + text + '</li>'; 

     $(li).appendTo('#list'); 
     counter++; 
     return false; 
    }); 
</script> 

Ansicht Modell

public IEnumerable<string> list {get; set;} 
... 

Wie kann ich diese Werte an meine Viewmodel binden implizit? Ich habe versucht, die counter Variable zu verwenden, um einen Namen zu jedem Elemente erstellt (wie list[counter]) zuweisen, aber auf der Steuerungsseite die list Variable auf meinem Viewmodel kommt noch leer.

+1

Ich bin wirklich kein Fan von html wie diese zu schaffen, IMHO ist es eine schlechte Praxis und schafft artifical Kopplung zwischen Schichten/Sprachen. Sie sollten auch Ihre Controller-Methoden Signaturen enthalten. –

+0

Ist Ihre Aktionsmethode wie 'MyAction (string [] mylist)'? –

+0

@ErikPhilips Ich werde die Post so bald wie möglich aktualisieren (wahrscheinlich morgen). Ich bin auch kein Fan von dieser Art von Code, aber wenn Sie einen besseren Vorschlag haben, bitte, weisen Sie mich darauf :) –

Antwort

2

Weil Ihre Sammlung nur für Werttyp (string), dann kann einfach

$('#add').click(function() { 
    var text = '<input type="text" name="list"></input>'; 
    .... 
}); 

Es ist nur notwendig, Indexer einzuschließen, wenn die Eigenschaft ein Mitglied eines komplexen Objekts ist.

Wenn Sie den Indexer tun sind, muss es bei Null beginnen und fortlaufend sein (es sei denn, Sie auch einen speziellen versteckten Eingang zu identifizieren den Indexer enthalten). Ihr Versuch, bei list[counter] mit fehlgeschlagen, da der Wert von counter zu 1 initialisiert (es hat funktioniert hätte, wenn Sie es var counter = 0; initialisiert)

3

Zunächst möchte ich Ihren Zähler auf die Menge an Li in Ihrer ungeordnete Liste Basis mit:

$('#list > li').size() 

Dann, um das Modell Binder glücklich pre-fix Ihre Immobilie mit der Liste zu halten:

'<input type="text" name="list[' + counter + ']"></input>' 

Der vollständige Code wird dann:

$('#add').click(function() { 
    var counter = $('#list > li').size(); 
    var text = '<input type="text" name="list[' + counter + ']"></input>'; 
    var li = '<li>' + text + '</li>'; 

    $(li).appendTo('#list'); 
    return false; 
}); 

jsFiddle

Bitte beachten Sie, müssen Sie die Ansicht Modell-Eigenschaft auf eine IList oder List für die Indizierung arbeiten ändern: Sie

public IList <string> list {get; set;} 
+0

Vielen Dank für Ihre Antwort! Während Ihre Antwort richtig ist (und einen klügeren Weg bietet, den Zähler zu benutzen), ist Stephen Mückes Kommentar zu der Frage einfacher und funktioniert auch. Ich brauchte keinen Zähler und musste den Typ der "Liste" in meinem ViewModel nicht ändern. –

+1

@ManuelReis Sorry von Ihrem Code Ich hatte die Annahme gemacht, dass es sich um einen komplexen Typ mit dem '....' im View-Modell handelt und dass Sie den nicht relevanten Code weggelassen haben. – hutchonoid

+0

Das ist wahrscheinlich meine Schuld, ich weiß nie, wie viel Code "zu viel Code" ist, wenn man eine Frage stellt. Vielen Dank für Ihre Hilfe. –