Добавление случая, когда имя класса для объекта, используемого в структуре сущности, такое же, как имя класса для файла с кодировкой веб-формы.
Предположим, у вас есть веб-форма 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 ()
Как говорили другие, вы должны сделать то и другое. Вот почему:
Сначала вы хотите проверить ввод на стороне клиента, потому что вы можете дать лучшую обратную связь среднему пользователю. Например, если они вводят неверный адрес электронной почты и переходят к следующему полю, вы можете немедленно показать сообщение об ошибке. Таким образом, пользователь может исправить каждое поле до отправки формы.
Если вы только проверяете на сервере, они должны отправить форму, получить сообщение об ошибке и попытаться выследить проблему.
(Эта боль может быть ослаблена, если сервер повторно отобразит форму с исходным входом пользователя, но проверка на стороне клиента еще быстрее.)
Вы хотите проверить на стороне сервера, потому что можете защитить от злонамеренного пользователя, который может легко обойти ваш JavaScript и отправить опасный ввод на сервер.
Очень опасно доверять вашему пользовательскому интерфейсу. Мало того, что они могут злоупотреблять вашим пользовательским интерфейсом, но они могут вообще не использовать ваш пользовательский интерфейс или даже браузер. Что делать, если пользователь вручную редактирует URL-адрес или запускает собственный Javascript или настраивает свои HTTP-запросы другим инструментом? Что делать, если они отправляют пользовательские HTTP-запросы из curl
или из сценария, например?
( Это не теоретически, например, я работал в поисковой системе путешествия, которая повторно отправила пользовательскую искать во многих авиакомпаниях, автобусных компаниях и т. д., отправив POST
запросы, как если бы пользователь заполнил форму поиска каждой компании, а затем собрал и отсортировал все результаты. Форма этих компаний JS никогда не исполнялась, и для нас это было важно что они предоставляют сообщения об ошибках в возвращенном HTML. Конечно, API был бы приятным, но это было то, что мы должны были сделать. )
Не позволяя это не только наивно от точки зрения безопасности, но также и нестандартного: клиенту должно быть разрешено отправлять HTTP любым способом, который они пожелают, и вы должны ответить правильно. Это включает проверку.
Валидация на стороне сервера также важна для совместимости. Не все пользователи, даже если они используют браузер, будут иметь JavaScript.
Существуют некоторые проверки, которые даже не могут быть правильно выполнены в коде приложения на стороне сервера и совершенно невозможны в клиентском коде, поскольку они зависят от текущего состояния базы данных. Например, «никто еще не зарегистрировал это имя пользователя» или «сообщение в блоге, которое вы комментируете по-прежнему существует», или «отсутствие существующего резервирования не совпадает с запрошенными вами датами» или «баланс вашего аккаунта по-прежнему достаточно для покрытия этой покупки «. Только база данных может достоверно проверять данные, которые зависят от связанных данных. Разработчики регулярно закручивают это , но PostgreSQL предоставляет некоторые хорошие решения .
Клиентская сторона должна использовать базовую проверку с помощью типов входных типов HTML5 и и поскольку они используются только для прогрессивных улучшений для лучшего удобства пользователя (даже если они не являются поддерживается на & lt; IE9 и сафари, но мы не полагаемся на них). Но основная проверка должна произойти на стороне сервера.
Вы можете выполнить проверку на стороне сервера и отправить обратно объект JSON с результатами проверки для каждого поля, с минимальным клиентом Javascript (просто отображать результаты) и по-прежнему иметь удобный интерфейс без необходимости повторять себя как на клиенте, так и на сервер.
Ну, я все еще нахожу какую-то комнату для ответа.
В дополнение к ответам Роба и Натана, я бы добавил, что валидация на стороне клиента имеет значение. Когда вы применяете проверки на своих веб-формах, вы должны следовать этим рекомендациям:
Оба типа валидаций играют важную роль в их соответствующий охват, но самый сильный - серверный. Если вы получаете 10 тыс. Пользователей в один момент времени, то вы, несомненно, в конечном итоге отфильтровываете количество запросов, поступающих на ваш веб-сервер. Если вы обнаружите, что произошла одна ошибка, например, неверный адрес электронной почты, они снова отправляют форму и просят пользователя исправить ее, что определенно будет использовать ресурсы вашего сервера и пропускную способность. Поэтому лучше применять проверку JavaScript. Если javascript отключен, ваша проверка на стороне сервера придет на помощь, и я ставлю, что только несколько пользователей могут случайно отключить его, так как 99,99% веб-сайтов используют javascript и уже включены по умолчанию во всех современных браузерах.
Вы должны всегда проверять на сервере.
Кроме того, проверка подлинности на клиенте приятна для пользователей, но совершенно небезопасна.
Преимущество проверки на стороне сервера с помощью проверки на стороне клиента заключается в том, что проверка на стороне клиента может быть обойдена / изменена:
Короче - всегда всегда проверяйте серверную сторону, а затем рассматривайте проверку на стороне клиента как добавленную «дополнительную», чтобы улучшить работу конечного пользователя .
Я столкнулся с интересной ссылкой, которая делает различие между грубыми, систематическими и случайными ошибками.
Client-Side validation
идеально подходит для предотвращения грубых и случайных ошибок. Обычно максимальная длина текстуры и ввода. Не имитируйте правило проверки на стороне сервера; (например, 200 символов на стороне клиента, n
на стороне сервера, продиктованной сильным бизнес-правилом).
Server-side validation
идеально подходит для предотвращения систематического ошибки; он будет обеспечивать соблюдение бизнес-правил.
В проекте, в котором я участвую, проверка выполняется на сервере через запросы ajax. На клиенте я отображаю сообщения об ошибках соответственно.
Дальнейшее чтение: грубые, систематические случайные ошибки:
https://answers.yahoo.com/question/index? QID = 20080918203131AAEt6GO
JavaScript может быть изменен во время выполнения.
Я предлагаю шаблон создания структуры проверки на сервере и совместного использования этого с клиентом.
Вам понадобится отдельная логика проверки на обоих концах, например:
"required"
атрибуты на стороне inputs
на стороне клиента
field.length > 0
server- .
Но использование той же спецификации проверки исключает некоторую избыточность (и ошибки) проверки зеркалирования на обоих концах.
Я просто повторю его, потому что это очень важно:
Всегда проверяйте на сервере
blockquote>и добавляйте JavaScript для пользовательской реакции .
Если вы выполняете световую проверку, лучше всего сделать это на клиенте. Он сохранит сетевой трафик, который поможет вашему серверу работать лучше. Если, если это осложняет проверку, которая включает в себя извлечение данных из базы данных или что-то вроде паролей, то лучше всего сделать это на сервере, где данные могут быть надежно проверены.
Да, проверка на стороне клиента может быть полностью обойдена, всегда. Вам нужно сделать и клиентскую сторону, чтобы обеспечить лучший пользовательский интерфейс, так и серверную сторону, чтобы быть уверенным, что введенный вами вход фактически проверен, а не просто предположительно подтвержден клиентом.
Я предлагаю реализовать проверку как на клиенте, так и на сервере, он сохраняет проект более безопасным ...... если я должен выбрать один, я пойду с проверкой на стороне сервера.
Update Jul 23 2018: следующая ссылка больше недоступна:
Здесь вы можете найти соответствующую информацию http://www.webexpertlabs.com/server-side-form-validation-using-regular-expression/