Это потому, что вы получаете, когда вы выполняете 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
}
}
Надеюсь, это поможет.
Это будет намного проще для вас, чтобы отлаживать, чем кто-либо другой. Вам нужно придерживаться точки останова в строке, где значение сеанса обновляется, и выяснять, почему он проходит через вашу логику, чтобы определить, почему он туда попал. – Liath
Я пробовал это, когда я пытаюсь обновить один из элементов в списке тем, что время его само по себе обновляется до сеанса. – user3157743
Что вы знаете о указателях? – jlvaquero