2014-02-04 2 views
1

У меня возникла проблема с сеансом, я просто получаю данные, которые хранятся в сеансе, и я обновил один из элементов в этом списке, а затем проверяю некоторые условия. Если условие выполнено, то он должен обновляться только в сеансе.Сессия автоматически обновляется в asp.net

Но проблема в том, что я не обновлялся в сеансе, который он отражает.

Ниже приведен код, который я написал.

int index = (Convert.ToInt32(context.Request["rowIndex"]) - 1); 
List<UserOrganizationMapping> updateUserOrgmapping = SessionHelper.GetSessionValue<List<UserOrganizationMapping>>("LstUserOrgMapping"); 

if (updateUserOrgmapping != null && updateUserOrgmapping.Count > 0) 
{ 
    updateUserOrgmapping[index].OrganizationName = context.Request["updateOrganizationName"]; 
    if (context.Request["updateOrganizationVal"] != "Select") 
    { 
     updateUserOrgmapping[index].OrganizationId = Convert.ToInt32(context.Request["updateOrganizationVal"]); 
    } 
    updateUserOrgmapping[index].ModifiedBy = System.Web.HttpContext.Current.Session["UserID"].ToString(); 
    updateUserOrgmapping[index].StartDate = Convert.ToDateTime(context.Request["updateStartDate"]); 
    updateUserOrgmapping[index].EndDate = Convert.ToDateTime(context.Request["updateEndDate"]); 
    string error = VerifyOverlapping(updateUserOrgmapping); 
    if (error != null) 
    { 
     GetSerializable(context, error); 
    } 
    else 
    { 
     updateUserOrgmapping = SessionHelper.GetSessionValue<List<UserOrganizationMapping>>("LstUserOrgMapping").ToList(); 
     SessionHelper.SetSessionValue("LstUserOrgMapping", updateUserOrgmapping); 
    } 

} 
+0

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

+0

Я пробовал это, когда я пытаюсь обновить один из элементов в списке тем, что время его само по себе обновляется до сеанса. – user3157743

+0

Что вы знаете о указателях? – jlvaquero

ответ

2

Это потому, что вы получаете, когда вы выполняете SessionHelper.GetSessionValue это ссылка на объект поэтому все последующие манипуляции с этим объектом отражается на том, где фактические данные сидят (кучу). И вот почему звонок в SessionHelper.SetSessionValue лишний в вашем случае.

Вы можете решить эту проблему путем копирования содержимого списка вы получаете от сеанса к новому объекту и выполнять ваши все манипуляции на этом недавно реализованный объекте вместо:

var updateUserOrmapping = new List<UserOrganizationMapping>(
    SessionHelper.GetSessionValue<List<UserOrganizationMapping>>("LstUserOrgMapping") 
); 

EDIT:

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

В общем случае в вашем случае вам необходимо вернуться к исходному состоянию экземпляра целевого объекта (updateUserOrgmapping[index]) при возникновении ошибки. Вот пример (не очень элегантно, но вы получите точку):

var originalOrganizationName = updateUserOrgmapping[index].OrganizationName; 
var originalOrganizationId = updateUserOrgmapping[index].OrganizationId; 
var originalModifiedBy = updateUserOrgmapping[index].ModifiedBy; 
var originalStartDate = updateUserOrgmapping[index].StartDate; 
var originalEndDate = updateUserOrgmapping[index].EndDate; 

updateUserOrgmapping[index].OrganizationName = context.Request["updateOrganizationName"]; 

// ... 

string error = VerifyOverlapping(updateUserOrgmapping); 
if (error != null) 
{ 
    updateUserOrgmapping[index].OrganizationName = originalOrganizationName; 
    updateUserOrgmapping[index].OrganizationId = originalOrganizationId; 
    updateUserOrgmapping[index].ModifiedBy = originalModifiedBy; 
    updateUserOrgmapping[index].StartDate = originalStartDate; 
    updateUserOrgmapping[index].EndDate = originalEndDate; 

    GetSerializable(context, error); 
} 

Более элегантное решение, вероятно, будет сделать поддержку UserOrganizationMapping глубокое копирование своего состояния, и тогда вы могли бы сделать что-то вроде этого:

string VerifyOverlapping(IList<UserOrganizationMapping> mappings, UserOrganizationMapping modifiedMapping, int modifiedMappingIndex) 
{ 
    string ret = null; 

    // Keeping the reference to the original mapping. 
    var originalMapping = mappings[modifiedMappingIndex]; 

    // Temporarily inserting the modified mapping for overlapping check. 
    mappings[modifiedMappingIndex] = modifiedMapping; 

    ret = VerifyOverlapping(mappings); 

    // Getting the original value back on error. 
    if (ret != null) 
     mappings[modifiedMappingIndex] = originalMapping; 

    return ret; 
} 

// ...  

int index = (Convert.ToInt32(context.Request["rowIndex"]) - 1); 
var updateUserOrgmapping = SessionHelper.GetSessionValue<List<UserOrganizationMapping>>("LstUserOrgMapping"); 

if (updateUserOrgmapping != null && updateUserOrgmapping.Count > 0) 
{ 
    var mapping = new UserOrganizationMapping(updateUserOrgmapping[index]) 
    { 
     OrganizationName = context.Request["updateOrganizationName"], 
     ModifiedBy = System.Web.HttpContext.Current.Session["UserID"].ToString(), 
     StartDate = Convert.ToDateTime(context.Request["updateStartDate"]), 
     EndDate = Convert.ToDateTime(context.Request["updateEndDate"]) 
    }; 

    if (context.Request["updateOrganizationVal"] != "Select") 
     mapping.OrganizationId = Convert.ToInt32(context.Request["updateOrganizationVal"]); 

string error = VerifyOverlapping(updateUserOrgmapping, mapping, index); 

if (error != null) 
    GetSerializable(context, error); 

// ... 

public class UserOrganizationMapping 
{ 
    public UserOrganizationMapping() { } 
    public UserOrganizationMapping(UserOrganizationMapping copyFrom) 
    { 
     this.Id = copyFrom.Id; 
     // Copy all field values 
    } 
} 

Надеюсь, это поможет.

+0

еще не работает – user3157743

+0

@ user3157743 Я обновил свой ответ. – volpav

+0

работает tnx. – user3157743

Смежные вопросы