Если вы используете этот код на локальном сервере (т. е. ваш компьютер для целей разработки), он не отправит электронное письмо получателю. Что произойдет, он создаст файл .txt
в папке с именем mailoutput
.
В случае, если вы используете бесплатный сервисный сервис, например 000webhost
или hostinger
, эти поставщики услуг отключают функцию mail()
, чтобы предотвратить непреднамеренное использование электронной почты, спам и т. д. Я предпочитаю вас чтобы связаться с ними, чтобы узнать, поддерживают ли они эту функцию.
Если вы уверены, что поставщик услуг поддерживает функцию mail (), вы можете проверить это руководство по PHP для дальнейшей справки, PHP mail ()
Чтобы проверить, поддерживает ли ваша служба хостинга функцию mail (), попробуйте запустить этот код (не забудьте изменить адрес электронной почты получателя)
Надеюсь, что это помогли.
Причиной такого поведения является то, что методы 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 ), создавая элемент метки, который не ведет себя как ярлыки (нажатие на них не будет устанавливать фокус на соответствующий элемент управления), ненужное использование элементов <br/>
(используйте css для стиль ваших элементов с полями и т. д.) и ненужное использование new { @id = "car-make-" + i }
. Код в вашем цикле может быть
@for (int i = 0; i < Model.Cars.Count; i++)
{
<div class="form-group row">
<hr />
@Html.LabelFor(m => m.Cars[i].Make, "Make (@i)")
@Html.TextBoxFor(m => m.Cars[i].Make, new { @class = "form-control" })
....
<input type="hidden" name="Cars.Index" value="@i" />
<button type="button" class="btn btn-sm btn-danger delete">Delete Entry</button>
</div>
}
$('.delete').click(function() {
$(this).closest('.form-group').remove();
}