Я разрабатываю веб-приложение для компании, в которой я работаю. Пользователь может динамически создавать строки в таблице HTML, устанавливая количество часов, с которыми они хотят работать. Это было достигнуто с помощью Javascript.
Например, если пользователь введет число 5, в таблице появятся 5 строк.
Как использовать мою модель с динамическими компонентами?
Я попытался добавить это внутри скрипта:
@Html.EditorFor(model => model.Price, new { htmlAttributes = new { @class = "form-control", id = "priceInput", type = "number" } })
Вместо:
const priceInput = document.createElement('priceInput');
Проверьте полный сценарий ниже.
<script type="text/javascript">
function changeRow() {
const aTable = document.getElementById('hourPriceTable');
const hourTextBox = document.getElementById('hourInput');
const rowNumber = parseInt(hourTextBox.value);
if (rowNumber) {
const rows = [];
for (let i = 1; i <= rowNumber; i++) {
if (rowNumber < 1 || rowNumber > 24) {
document.getElementById('error').innerText = ('O número de horas precisa de ser entre 1 e 24.');
document.getElementById('error').style.color = 'red';
return false;
} else {
document.getElementById('error').innerText = '';
}
const row = document.createElement('tr');
const th = document.createElement('th');
const td2 = document.createElement('td');
th.setAttribute("class", "text-center");
td2.setAttribute("class", "text-center");
const priceInput = document.createElement('priceInput');
priceInput.type = 'number';
priceInput.setAttribute("class", "text-center");
th.append(i);
td2.append(input);
row.append(th);
row.append(td2);
rows.push(row);
}
aTable.innerHTML = "";
rows.forEach(row => aTable.append(row));
}
}
</script>
Я хотел бы, чтобы модель, которую я использую, работала с данными (хранящимися в базе данных), вставленными в эти динамические строки, поскольку они имеют текстовые поля внутри. Я боролся с добавлением этой функциональности, так как не могу использовать Html.EditorFor для создания текстовых полей внутри кода JavaScript.
Любая помощь приветствуется, извините, если это сбивает с толку.
Если ваш javascript находится в представлении, вы можете установить переменную в виде строки html: -
<script>
var input = '@Html.EditorFor(model => model.CertificateCode, new { htmlAttributes = new { @class = "form-control", id = "priceInput", type = "number" } })';
</script>
input
теперь будет html-строкой элемента input.
затем вы можете создать элемент js, передав input
строку этому:
function createElementFromHTML(htmlString) {
var div = document.createElement('div');
div.innerHTML = htmlString.trim();
// Change this to div.childNodes to support multiple top-level nodes
return div.firstChild;
}
или, если у вас есть jQuery, вы можете просто использовать:
<script>
var input = '@Html.EditorFor(model => model.CertificateCode, new { htmlAttributes = new { @class = "form-control", id = "priceInput", type = "number" } })';
var element = $(input);
</script>
Html.EditorFor
) и генерирует HTML. Клиентский браузер отображает HTML и выполняет JavaScript . Обратите внимание, что существует строгое разделение контекстов выполнения и что все (и только вещи), которые попадают в HTML (или ресурс JavaScript, например), «каким-либо способом», могут использоваться на клиенте.