Работа с событием Click срабатывает только один раз, когда я добавляю Sidebar [duplicate]

Добавление случая, когда имя класса для объекта, используемого в структуре сущности, такое же, как имя класса для файла с кодировкой веб-формы.

Предположим, у вас есть веб-форма Contact.aspx, чей класс codebehind Свяжитесь с вами, и у вас есть имя объекта Contact.

Затем следующий код вызовет исключение NullReferenceException при вызове context.SaveChanges ()

Contact contact = new Contact { Name = "Abhinav"};
var context = new DataContext();
context.Contacts.Add(contact);
context.SaveChanges(); // NullReferenceException at this line

Ради полноты класса DataContext

public class DataContext : DbContext 
{
    public DbSet Contacts {get; set;}
}

и класс сущности контакта. Иногда классы сущностей являются частичными классами, так что вы можете распространять их и в других файлах.

public partial class Contact 
{
    public string Name {get; set;}
}

Ошибка возникает, когда оба класса entity и codebehind находятся в одном и том же пространстве имен. Чтобы исправить это, переименуйте класс сущности или класс codebehind для Contact.aspx.

Причина. Я все еще не уверен в причине. Но всякий раз, когда какой-либо из классов сущностей расширяет System.Web.UI.Page, возникает эта ошибка.

Для обсуждения рассмотрим NullReferenceException в DbContext.saveChanges ()

193
задан Sean Thoman 6 January 2012 в 03:48
поделиться

7 ответов

Если вы хотите, чтобы обработчик клика работал для элемента, который динамически загружается, вы устанавливаете обработчик событий на родительском объекте (который не загружается динамически) и присваивает ему селектор, который соответствует вашему динамическому объекту следующим образом:

$('#parent').on("click", "#child", function() {});

Обработчик события будет прикреплен к объекту #parent, и в любое время, когда событие клика дойдет до него, которое возникло на #child, оно запустит ваш обработчик кликов. Это называется делегированной обработкой событий (обработка события делегирована родительскому объекту).

Это делается так, потому что вы можете присоединить событие к объекту #parent, даже если объект #child существует, но когда он будет существовать позже и будет нажат, событие щелчка будет пузыриться до объекта #parent, он увидит, что он возник из #child, и есть обработчик события для щелчка на #child и запустите ваше событие.

559
ответ дан jfriend00 27 August 2018 в 11:40
поделиться

Попробуйте следующее:

$('#parent').on('click', '#child', function() {
    // Code
});

Из документации $.on() :

Обработчики событий привязаны только к выбранным в данный момент элементам ; они должны существовать на странице в момент, когда ваш код делает вызов .on().

Ваш #child элемент не существует, когда вы вызываете $.on() на нем, поэтому событие не связано (в отличие от $.live()). #parent, однако существует , поэтому привязка события к этому прекрасна.

Второй аргумент в моем коде выше действует как «фильтр», чтобы запускать только, если событие [b8] от #child до #parent.

32
ответ дан Bojangles 27 August 2018 в 11:40
поделиться

Я использовал «живой» в своем проекте, но один из моих друзей предположил, что вместо «живого» я ​​должен использовать «on». И когда я попытался использовать это, у меня возникла такая проблема, как у вас.

На моих страницах я динамически создаю строки строк для строк и многое другое. но когда я использую волшебство, исчезли.

Другие решения, такие как использование его, как ребенок, каждый раз нажимают ваши функции каждый раз при каждом нажатии. Но я нашел способ сделать это снова, и вот решение.

Напиши свой код как:

function caller(){
    $('.ObjectYouWntToCall').on("click", function() {...magic...});
}

Call caller (); после того, как вы создадите свой объект на странице следующим образом.

$('<dom class="ObjectYouWntToCall">bla... bla...<dom>').appendTo("#whereeveryouwant");
caller();

Таким образом, ваша функция вызывается, когда предполагается, что не каждый клик на странице.

3
ответ дан Coderx07 27 August 2018 в 11:40
поделиться

Эквивалент .live () в 1.7 выглядит так:

$(document).on('click', '#child', function() ...); 

В принципе, смотрите документ для событий кликов и фильтруйте их для #child.

11
ответ дан Jared 27 August 2018 в 11:40
поделиться

$(document).on('click', '#selector', function() { /* do stuff */ });

EDIT: Я предоставляю немного больше информации о том, как это работает, потому что ... слова. В этом примере вы размещаете слушателя по всему документу.

Когда вы click на любом элементе (элементах), соответствующем #selector, событие пузырится до основного документа - пока нет других слушателей, которые вызывают метод event.stopPropagation() - который вверх по пузырьку события для родительских элементов.

Вместо привязки к определенному элементу или набору элементов вы слушаете любые события, исходящие от элементов, соответствующих указанному селектору. Это означает, что вы можете создать один прослушиватель, один раз, который будет автоматически соответствовать текущим существующим элементам, а также любым динамически добавленным элементам.

Это разумно по нескольким причинам, включая использование производительности и памяти (в больших масштабах приложения)

20
ответ дан lawrencealan 27 August 2018 в 11:40
поделиться

.on () для jQuery версии 1.7 и выше. Если у вас установлена ​​более старая версия, используйте это:

$("#SomeId").live("click",function(){
    //do stuff;
});
5
ответ дан Matt Cashatt 27 August 2018 в 11:40
поделиться

Я знаю, что немного поздно ответить, но я создал полиполк для метода .live (). Я тестировал его в jQuery 1.11, и, похоже, он работает очень хорошо. Я знаю, что мы должны внедрять метод .on (), где это возможно, но в больших проектах, где невозможно преобразовать все вызовы .live () в эквивалентные вызовы .on () по любой причине, work:

if(jQuery && !jQuery.fn.live) {
    jQuery.fn.live = function(evt, func) {
        $('body').on(evt, this.selector, func);
    }
}

Просто включите его после загрузки jQuery и перед вызовом live ().

9
ответ дан NSV 27 August 2018 в 11:40
поделиться
Другие вопросы по тегам:

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