Причиной такого поведения является то, что методы HtmlHelper
используют значение из ModelState
(если оно существует), чтобы установить атрибут value
, а не фактическое значение модели. Причина этого поведения объясняется в ответе на TextBoxFor для отображения начального значения, а не значения, обновленного из кода .
В вашем случае, когда вы отправляете, добавляются следующие значения to ModelState
Cars[1].Make: Land Rover 2
Cars[2].Make: Audi 3
Cars[3].Make: Honda 4
Обратите внимание, что для Cars[0].Make
нет значения, поскольку вы удалили первый элемент в представлении.
Когда вы возвращаете представление, теперь коллекция содержит
Cars[0].Make: Land Rover 2
Cars[1].Make: Audi 3
Cars[2].Make: Honda 4
Итак, в первой итерации цикла метод TextBoxFor()
проверяет ModelState
на соответствие, не находит его и генерирует value="Land Rover 2"
(т. е. значение модели) и ваш ручной ввод также считывает значение модели и устанавливает value="Land Rover 2"
. На второй итерации TextBoxFor()
находит соответствие для Cars[1]Make
в ModelState
, поэтому устанавливает value="Land Rover 2"
и ручные входы читает значение модели и устанавливает value="Audi 3"
.
Я предполагаю, что этот вопрос - это просто объяснение поведения (на самом деле вы сохранили бы данные и затем перенаправили бы на метод GET, чтобы отобразить новый список ), но вы можете сгенерировать правильный вывод, когда вы вернете представление, вызвав [f1 8], который очистит все значения ModelState
, чтобы TextBoxFor()
генерировал атрибут value
на основе значения модели.
Сторона примечания: вы видите много плохой практики, включая загрязнение вашего разметка с поведением (используйте Unobtrusive JavaScript ), создавая элемент метки, который не ведет себя как ярлыки (нажатие на них не будет устанавливать фокус на соответствующий элемент управления), ненужное использование элементов
(используйте css для стиль ваших элементов с полями и т. д.) и ненужное использование new { @id = "car-make-" + i }
. Код в вашем цикле может быть
@for (int i = 0; i < Model.Cars.Count; i++)
{
@Html.LabelFor(m => m.Cars[i].Make, "Make (@i)")
@Html.TextBoxFor(m => m.Cars[i].Make, new { @class = "form-control" })
....
}
$('.delete').click(function() {
$(this).closest('.form-group').remove();
}
{
"cmd": ["node","$file"]
}
отлично работает для меня в окнах и показывает вывод в возвышенном окне. Хотя я не знаю, как остановить сервер после возвышенного, мне нужно искать и убивать процесс узла.
Кроме того, проверьте узел в вашем PATH;)
Надеюсь, он работает для вас.
В Linux я использую это, просто убедитесь, что вы находитесь в вашем основном файле
{
"shell_cmd": "pkill node ; node $file"
}
Может быть, это зависит от переменных среды - попробуйте использовать полный путь к узлу, а не просто «nodejs». У меня это работало в Mac OS (например, / usr / local / node вместо просто node)
Это работает для меня в Windows7
1) Откройте Sublime Text, выберите «Инструменты» -> «Система сборки» -> «Новая система сборки»
2) Вставьте этот текст
{
"cmd": ["C:\\Program Files (x86)\\nodejs\\node","$file"]
}
\\ Выходящий символ
3) Сохранить как Node.sublime-build
4) Напишите новый файл js и нажмите CTRL + B для сборки.
Нажмите здесь , чтобы увидеть пример изображения.
В Windows работает следующая конфигурация:
{
"cmd": ["C:\\Program Files\\nodejs\\node.exe", "$file"],
"selector": "source.js"
}
Пользователи Mac, введите which node
в терминале. Он выводит путь к исполняемому файлу узла, который в большинстве случаев равен /usr/local/bin/node
. Теперь создайте новую систему сборки (Tools > Build System > New Build System
) со следующими настройками в Sublime Text.
{
"cmd": ["/usr/local/bin/node", "$file"],
"selector": "source.js"
}
Метод № 2 по ссылке ниже решен для меня:
http://www.wikihow.com/Create-a-Javascript-Console-in-Sublime-Text
Вот совет для Windows,
Большинство ответов из этой темы правильные, но ни один из них не завершен, и, по крайней мере, ни один ответ не говорит о том, как убить существующий процесс Node, даже если вы можете запустить узел в возвышенном. Таким образом, в конечном итоге, если любой из вышеперечисленных подходов сработал для вас, вы в конечном итоге убьете Node вручную.
Вот что я сделал для «Windows»:
taskkill / F / IM "node.exe" "c: / Program Files /nodejs/node.exe "% 1
Наслаждайтесь кодированием.
Обычно
"cmd":["node",$file]
будет работать. Однако нет способа остановить сервер, чем. Я нашел лучшее решение, которое открывает сервер в новой консоли и закрывает его автоматически. Я также хорошо работаю с супервизорами или инспекторами узлов
"cmd" : ["start", "cmd.exe", "/C", "node", "$file"]
Надеюсь, это поможет
Я могу видеть вывод консоли только в том случае, если файл существует / сохранен на диске. (для анонимного файла я тоже не вижу вывод)
Надеюсь, это поможет
Если ничего не помогает, проверьте Node Supervisor ....... вам нужно только изменить код, и сервер сам перезагрузится, чтобы вы могли увидеть изменения вживую =)
Проверено на Ubuntu Linux. Используйте селектор файлов, как показано ниже:
{
"cmd": ["node", "$file"],
"selector": "*.js"
}