TempoClick Ответов: 1

Используйте переменную javascript в razor: "имя 'I' не существует в текущем контексте"


У меня есть таблица из одного столбца атрибута List<string> strengthC
<table>
<thead>
 <tr>
  <th>
     @Html.LabelFor(model => model.strengthC, htmlAttributes: new { @class = "control-label col-md-3" })
  </th>
 </tr>
</thead>
<tbody>
 <tr>
  <td>
     @Html.EditorFor(model => model.strengthC[0], new { htmlAttributes = new { @class = "form-control", @style = "background-color: Azure; opacity:0.9" } })
@Html.ValidationMessageFor(model => model.strengthC, "", new { @class = "text-danger" })
  </td>
 </tr>
</tbody>
</table>

Я хочу добавить новые строки в таблицу со счетчиком 'i' это и есть индекс strength[i] использование JavaScript.

Что я уже пробовал:

<script type="text/javascript">
var i = 0;
function newRow() {
   i += 1;
$('#mainTable tr:last').after('<tr><td>@Html.EditorFor(model => model.strengthC[i], new { htmlAttributes = new { @class = "form-control", @style = "background-color: Azure; opacity:0.9" } })
@Html.ValidationMessageFor(model => model.strengthC, "", new { @class = "text-danger" }</td></tr>');
    }
</script>

Проблема здесь в том, что model.strengthC[i] не принимает 'i' в качестве параметра: "имя 'i' не существует в текущем контексте"

F-ES Sitecore

Вы не можете этого сделать, потому что ваш код razor запускается на сервере для генерации html, который затем отправляется в браузер для выполнения. Ваша строка model.strength[i] выполняется на сервере до того, как результирующий js будет отправлен в браузер для выполнения, поэтому "i" как концепция javascript еще не существует, он ищет переменную под названием "i" в вашем серверном коде.

Вам придется создать html-код, чтобы добавить новую строку в обычном режиме. Если вы посмотрите на источник вашей страницы, то увидите, как вам нужно построить элементы, это, вероятно, будет вход с именем "strength[0]", "strength[1]" и т. д., Поэтому вам просто нужно создать новый вход с именем "strength[n]", где "n" - следующее число в последовательности.

Если вы загуглите "mvc create dynamic editor via javascript", то, вероятно, найдете пример кода.

TempoClick

Но как передать n в функцию javascript, а затем использовать ее в strengthC[]?

1 Ответов

Рейтинг:
1

#realJSOP

Во-первых, почему вас беспокоит индекс элемента, который вы редактируете? Кажется странным, учитывая природу EditFor.

Не делайте этого на стороне клиента. Сделай это так:

@foreach(var item in Model)
{
    @* if you really need the index, you can do this in a foreach loop *@
    int index = Model.IndexOf(item);
    <tr>
        <td>
            @Html.EditFor(m=>m.strengthC[index],...)
            ...
        </td>
   </tr>
}


TempoClick

Я вставляю новую строку с помощью нажатия кнопки. затем мне нужно передать все вставленные элементы (strengthC[0], strengthC[1].....) контроллеру.

#realJSOP

Вы все равно должны делать это на стороне сервера. MVC поддерживает это.