Добавление случая, когда имя класса для объекта, используемого в структуре сущности, такое же, как имя класса для файла с кодировкой веб-формы.
Предположим, у вас есть веб-форма 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 ()
Если вы хотите, чтобы обработчик клика работал для элемента, который динамически загружается, вы устанавливаете обработчик событий на родительском объекте (который не загружается динамически) и присваивает ему селектор, который соответствует вашему динамическому объекту следующим образом:
$('#parent').on("click", "#child", function() {});
Обработчик события будет прикреплен к объекту #parent
, и в любое время, когда событие клика дойдет до него, которое возникло на #child
, оно запустит ваш обработчик кликов. Это называется делегированной обработкой событий (обработка события делегирована родительскому объекту).
Это делается так, потому что вы можете присоединить событие к объекту #parent
, даже если объект #child
существует, но когда он будет существовать позже и будет нажат, событие щелчка будет пузыриться до объекта #parent
, он увидит, что он возник из #child
, и есть обработчик события для щелчка на #child
и запустите ваше событие.
Попробуйте следующее:
$('#parent').on('click', '#child', function() {
// Code
});
Из документации $.on()
:
Обработчики событий привязаны только к выбранным в данный момент элементам ; они должны существовать на странице в момент, когда ваш код делает вызов
blockquote>.on()
.Ваш
#child
элемент не существует, когда вы вызываете$.on()
на нем, поэтому событие не связано (в отличие от$.live()
).#parent
, однако существует , поэтому привязка события к этому прекрасна.Второй аргумент в моем коде выше действует как «фильтр», чтобы запускать только, если событие [b8] от
#child
до#parent
.
Я использовал «живой» в своем проекте, но один из моих друзей предположил, что вместо «живого» я должен использовать «on». И когда я попытался использовать это, у меня возникла такая проблема, как у вас.
На моих страницах я динамически создаю строки строк для строк и многое другое. но когда я использую волшебство, исчезли.
Другие решения, такие как использование его, как ребенок, каждый раз нажимают ваши функции каждый раз при каждом нажатии. Но я нашел способ сделать это снова, и вот решение.
Напиши свой код как:
function caller(){
$('.ObjectYouWntToCall').on("click", function() {...magic...});
}
Call caller (); после того, как вы создадите свой объект на странице следующим образом.
$('<dom class="ObjectYouWntToCall">bla... bla...<dom>').appendTo("#whereeveryouwant");
caller();
Таким образом, ваша функция вызывается, когда предполагается, что не каждый клик на странице.
Эквивалент .live () в 1.7 выглядит так:
$(document).on('click', '#child', function() ...);
В принципе, смотрите документ для событий кликов и фильтруйте их для #child.
$(document).on('click', '#selector', function() { /* do stuff */ });
EDIT: Я предоставляю немного больше информации о том, как это работает, потому что ... слова. В этом примере вы размещаете слушателя по всему документу.
Когда вы click
на любом элементе (элементах), соответствующем #selector
, событие пузырится до основного документа - пока нет других слушателей, которые вызывают метод event.stopPropagation()
- который вверх по пузырьку события для родительских элементов.
Вместо привязки к определенному элементу или набору элементов вы слушаете любые события, исходящие от элементов, соответствующих указанному селектору. Это означает, что вы можете создать один прослушиватель, один раз, который будет автоматически соответствовать текущим существующим элементам, а также любым динамически добавленным элементам.
Это разумно по нескольким причинам, включая использование производительности и памяти (в больших масштабах приложения)
.on () для jQuery версии 1.7 и выше. Если у вас установлена более старая версия, используйте это:
$("#SomeId").live("click",function(){
//do stuff;
});
Я знаю, что немного поздно ответить, но я создал полиполк для метода .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 ().