Добавление случая, когда имя класса для объекта, используемого в структуре сущности, такое же, как имя класса для файла с кодировкой веб-формы.
Предположим, у вас есть веб-форма 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 ()
Беспокойство об истории браузера и обратной кнопке даст вам головные боли и генитальные бородавки. Для решения этой проблемы есть средства.
Ваша кнопка выхода / кнопка должна указывать на страницу, содержащую этот код, и все, что вы хотите.
[vb.net]
Imports System.Web.Security
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
Session.Abandon()
FormsAuthentication.SignOut()
End Sub
[c #]
using System.Web.Security;
private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
Session.Abandon();
FormsAuthentication.SignOut();
}
Код исходит из этой страницы и действителен, но страница сильно на глаза.
Хороший вопрос / ответ о поведении с подлодками можно найти здесь здесь .
Обновление:
в соответствии с беседой, которую я имею с Матфеем, отключение кэширования на отдельных страницах, которые являются чувствительными или волевыми, может быть выполнено с помощью кода, такого как:
Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
Мне любопытно узнать, работает ли оно для вас, как и для меня.
Этот код очень полезен
Response.Cache.SetCacheability(HttpCacheability.NoCache);
. Поместите этот код только в событие загрузки, на главном pagen в случае, но он работает только для IE, для IE и Firefox я использовал
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
на самом деле я нашел решение, я добавил следующий фрагмент к методу загрузки страницы главной страницы.
Page.Response.Cache.SetCacheability(HttpCacheability.NoCache);
спасибо за ответ в любом случае:)
Вы можете использовать javascript для отключения кнопки «Назад» (обычно путем отправки пользователя на страницу, которая пересылается на другую страницу, так что щелчок назад снова отправляет вам вперед). Постоянный пользователь все еще может вернуться на 2 этапа назад и перешагнуть через цикл.
Эта страница находится в кеше браузера. Вы можете попросить браузер не кэшировать что-либо, но это может испортить производительность, а иногда и резко, поэтому я бы не рекомендовал ее.
Вы можете попробовать использовать свойство HttpResponse.Cache, если это поможет:
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(false);
Response.Cache.VaryByParams["Category"] = true;
if (Response.Cache.VaryByParams["Category"])
{
//…
}
Или может блокировать кэширование страницы в целом с помощью HttpResponse.CacheControl, но ее устарело в пользу кэша свойство выше:
Response.CacheControl = “No-Cache”;
ИЛИ вы действительно можете сходить с ума и сделать все это вручную:
Response.ClearHeaders();
Response.AppendHeader(“Cache-Control”, “no-cache”); //HTTP 1.1
Response.AppendHeader(“Cache-Control”, “private”); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “no-store”); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “must-revalidate”); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “max-stale=0″); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “post-check=0″); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “pre-check=0″); // HTTP 1.1
Response.AppendHeader(“Pragma”, “no-cache”); // HTTP 1.1
Response.AppendHeader(“Keep-Alive”, “timeout=3, max=993″); // HTTP 1.1
Response.AppendHeader(“Expires”, “Mon, 26 Jul 1997 05:00:00 GMT”); // HTTP 1.1
Лучшая работа - разместить следующий код на главной странице. Он избегает кеширования страниц и не позволяет пользователю получить доступ к нему после выхода из системы.
P.S: Следующие коды являются компиляцией из разных источников. Отправил его, чтобы любой, кто искал решение, мог бы найти его полезным
Master.cs
protected void Page_Load(object sender, EventArgs e)
{
Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
}
Master.aspx
<a href="logout.aspx">Logout</span></a>
logout.cs
protected void Timer1_Tick(object sender, EventArgs e)
{
Session.Clear();
Session.Abandon();
Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
try
{
Session.Abandon();
FormsAuthentication.SignOut();
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Buffer = true;
Response.ExpiresAbsolute = DateTime.Now.AddDays(-1d);
Response.Expires = -1000;
Response.CacheControl = "no-cache";
//Response.Redirect("login.aspx", true);
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
Response.Redirect("Signin.aspx");
}
logout.aspx
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" Text="Loggin Out Please Wait" runat="server" />
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Timer ID="Timer1" runat="server" Interval="1000" OnTick="Timer1_Tick">
</asp:Timer>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</div>
</form>
Обходной путь к этому - добавить следующий код javascript в раздел страницы logout.aspx:
<script type="text/javascript">
window.history.forward(1);
</script>
Этот javascript-код отправит пользователя обратно, если пользователь доберется до страницы выхода из системы, нажав кнопку «Назад».
Если вам нужно убедиться, что у пользователя нет возможности вернуться на страницы после выхода из системы, вы должны попросите браузер не кэшировать ни одну из страниц, включив на каждой странице код, похожий на следующий:
Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();