Tach!
ich würde hidden input nehmen. Für den Fall, dass JS deaktiviert ist, kann man dann immer noch einen Save-Button unter die Liste setzen (den man als PE im Startup des JS verschwinden lässt). Aus diesem Grund würde ich auch ein Form um die komplette Tabelle legen, nicht um jede Artikelzelle
Warte mal, wenn ich mir das recht überlege, war das ja nicht nur irgendeine ID, sondern das war die ID des Datensatzes der jeweiligen Zeile. Wenn wir nur den Javascript-Fall betrachten, dann ist es egal, wo genau die pro Zeile abgelegt ist. Das ist eine einmal zu definierende Regel, sich dorthin zu navigieren und den Wert zu holen.
Aber wenn die gesamte Geschichte auch ohne Javascript funktionieren soll, dann muss man etwas mehr Festlegungen treffen. Sollen in dem Fall wirklich alle Datensätze abgeschickt werden, auch die nicht veränderten? Dann wäre ein großes Form sinnvoll. Da man dafür die einzelnen Eingabefelder unterscheiden muss, hilft eine anderswo stehende ID nicht viel. Sie muss stattdessen im Namen des Input-Elements vorkommen, damit man serverseitig feststellen kann, für welchen Datensätze jetzt die einzelnen Werte sind.
Alternativ je ein Form pro Zelle (zeilenweise geht es nicht in table-tr-td zu schachteln) und da kann dann die ID auch in einem extra Hidden-Input stehen.
dedlfix.