Я использую ASP.Net MVC вместе с Jquery для создания страницы, которая содержит раздел с контактными данными, который позволит пользователю вводить различные контактные данные:
<div id='ContactDetails'>
<div class='ContactDetailsEntry'>
<select id="venue_ContactLink_ContactDatas[0]_Type" name="venue.ContactLink.ContactDatas[0].Type"><option>Email</option>
<option>Phone</option>
<option>Fax</option>
</select>
<input id="venue_ContactLink_ContactDatas[0]_Data" name="venue.ContactLink.ContactDatas[0].Data" type="text" value="" />
</div>
</div>
<p>
<input type="submit" name="SubmitButton" value="AddContact" id='addContact'/>
</p>
Предполагается, что нажатие кнопки добавляет шаблонную версию div-элемента ContactDetailsEntry на страницу. Однако я также должен убедиться, что индекс каждого идентификатора увеличивается.
Мне удалось сделать это с помощью следующей функции, которая срабатывает при нажатии кнопки:
function addContactDetails()
{
var len = $('#ContactDetails').length;
var content = "<div class='ContactDetailsEntry'>";
content += "<select id='venue_ContactLink_ContactDatas["+len+"]_Type' name='venue.ContactLink.ContactDatas["+len+"].Type'><option>Email</option>";
content += "<option>Phone</option>";
content += "<option>Fax</option>";
content += "</select>";
content += "<input id='venue_ContactLink_ContactDatas["+len+"]_Data' name='venue.ContactLink.ContactDatas["+len+"].Data' type='text' value='' />";
content += "</div>";
$('#ContactDetails').append(content);
}
Это прекрасно работает, однако, если я изменяю HTML, мне нужно изменить его в двух местах.
Я рассмотрел использование clone () для этого, но у меня есть три проблемы:
РЕДАКТИРОВАТЬ: я нашел ответы на вопросы, как показано ниже:
- (это общая проблема, на которую я не могу найти ответ) как мне создать селектор для идентификаторов, которые содержат угловые скобки, так как jquery использует их для селектора атрибута.
РЕДАКТИРОВАТЬ: Ответ с помощью \, чтобы выйти за скобки, т. Е.
$('#id\\[0\\]')
- как мне изменить идентификаторы в дереве.
РЕДАКТИРОВАТЬ: Я создал функцию следующим образом:
function updateAttributes(clone, count) {
var f = clone.find('*').andSelf();
f.each(function(i){
var s = $(this).attr("id");
if (s!=null&& s!="")
{
s = s.replace(/([^\[]+)\[0\]/, "$1["+count+"]");
$(this).attr("id", s);
}});
Похоже, что это работает при вызове с клонированным набором и подсчетом существующих версий этого набора. Это не идеально, так как мне нужно выполнить то же самое для имени и для атрибутов. Я продолжу работать над этим и добавлю ответ, когда он у меня будет. Буду признателен за любые дальнейшие комментарии о том, как я мог бы улучшить это, чтобы оно было общим для всех тегов и атрибутов, которые может создать asp.net mvc.
- как мне клонировать из шаблона, т.е. не из активного набора полей, в который уже введены данные, или вернуть полям их значения по умолчанию в клонированном наборе.