ASP.NET MVC 5 всегда отображает первую строку в таблице [duplicate]

Если вы используете этот код на локальном сервере (т. е. ваш компьютер для целей разработки), он не отправит электронное письмо получателю. Что произойдет, он создаст файл .txt в папке с именем mailoutput.

В случае, если вы используете бесплатный сервисный сервис, например 000webhost или hostinger, эти поставщики услуг отключают функцию mail(), чтобы предотвратить непреднамеренное использование электронной почты, спам и т. д. Я предпочитаю вас чтобы связаться с ними, чтобы узнать, поддерживают ли они эту функцию.

Если вы уверены, что поставщик услуг поддерживает функцию mail (), вы можете проверить это руководство по PHP для дальнейшей справки, PHP mail ()

Чтобы проверить, поддерживает ли ваша служба хостинга функцию mail (), попробуйте запустить этот код (не забудьте изменить адрес электронной почты получателя)


Надеюсь, что это помогли.

3
задан Dave 25 February 2016 в 15:06
поделиться

1 ответ

Причиной такого поведения является то, что методы 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();
}
5
ответ дан Community 22 August 2018 в 13:20
поделиться
  • 1
    Фантастическое объяснение. Это очень помогло, и я очень благодарен вам за то, что вы нашли время прокомментировать мою разметку. – Dave 29 February 2016 в 16:27
Другие вопросы по тегам:

Похожие вопросы: