오늘은 내부 직원이 일부 제품 정보를 수정할 수있는 작은 asp.net 베타 웹 응용 프로그램을 발표했습니다. 각 직원이 완전히 다른 행 (제품)을 편집하고 있었지만 사용자가 제품 정보를 서로 덮어 쓰는 문제가 발생했습니다. 에 따라, 그래서ASP.NET C# 정적 변수는 전역 변수입니까?
// EditProductGroup.aspx.cs
public partial class EditProductGroup : System.Web.UI.Page
{
private static int _groupId = 0;
protected void Page_Load(object sender, EventArgs e)
{
_groupId = Convert.ToInt16(Request.QueryString["GroupID"]);
// get existing ProductGroup information from database using
//_groupId to find the row and populate textboxes
}
private void saveProductGroupData()
{
// when user hits 'save changes' button, update row
//where the primary key column 'ProductGroupID' matches _groupId in the table
}
}
: 구글에 대한 몇 가지 검색 후
, 나는 내가 정적 변수의 사용과 관련, 무슨 일이 일어나고 있는지 알고 있다고 생각 아래 빠른 거친 문제의 예입니다 내 연구에 따르면 정적 변수는 실제로 응용 프로그램 전체에 실제로 존재합니다. 즉, 여러 사용자가 응용 프로그램을 사용하는 경우 실제로 '_groupId'에 대해 동일한 '값'을 읽는 경우가 있고 어떤 경우에는 실제로 다른 변수 값을 사용하여 페이지의 다른 사용자의 인스턴스에서 잘못된 행 (ProductGroupId)에 데이터를 저장합니다.내 의도는 정적 변수가 다른 사용자로부터 격리되었고 intefere하지 않아야한다는 것이 었습니다. 각 사용자는 페이지의 자체 인스턴스를 가지므로 '_groupId'변수의 자체 인스턴스가 있습니다.
운 좋게도 모두 실제 데이터베이스가 아닌 dev/staging 데이터베이스에서 발생했습니다. 나는 모든 사람이 읽고 쓰는 변수를 멈추기 위해 '정적'키워드를 버려야하는지 잘 모르겠습니다.
의견이 있으십니까? 감사합니다
감사합니다. 아담 .... 유일한 것은, 다른 페이지에서 사용하기 위해 이것을 저장할 필요가 없습니다. 단지 '요청'의 내용을 저장하려고합니다.QueryString [ "GroupID"] '을 해당 페이지 내의 아무 곳에서나 사용할 수있는 변수에 넣으십시오 ... 페이지의'다른 '사용자 인스턴스에 의해 변경되지 않고 ... "private _groupId"(static 키워드는 생략)가 허용됩니까? 이거? 그렇지 않다면 세션을 사용할 수 있다고 생각합니다. 의견을 보내 주셔서 감사합니다! – Dal
Dal - 세션 변수는 사용자가 수동으로 만료하지 않는 한 클라이언트 브라우저 세션 전체에 대해보고있는 페이지와 상관없이 보관됩니다. ViewState를 사용하여 값을 저장할 수 있지만 클라이언트에 기본 설정으로 스트리밍되므로 스트레스가 심할 가능성이 있습니다 (가능성은 낮습니다). ViewState는 페이지 단위로 값을 유지합니다. 처음에 사용하는 QueryString 값을 계속 사용할 수없는 이유가 있습니까? 귀하의 상황에 맞는 저장을 위해 QueryString, ViewState, HiddenField 또는 Session을 권하고 싶습니다. –
빠른 답장을 보내 주셔서 감사합니다. 응용 프로그램이 querystring을 변수로 직접 푸는 대신 직접 사용하도록 수정되었으므로이 메서드 (QueryString)를 계속 사용한다고 생각합니다. static 키워드없이 원래의 구현이 여전히 작동하는지 궁금했습니다. 고마워요! :) – Dal