如果有人帮我理解这种情况,我将不胜感激。 我不知道为什么,但是当我编辑选定的ListView项目(包含少量TextBoxes)然后在ItemUpdating事件中按更新按钮时,我总是得到旧值而不是最近输入的值。 为什么?
这是ItemUpdating方法的代码:
ListViewItem editItem = AdminUsersListView.EditItem;
Guid userId = new Guid((editItem.FindControl("UserId") as HiddenField).Value);
Hashtable dataUpdate = new Hashtable
{
{ "UserName", Request[ (editItem.FindControl("UserNameNew") as TextBox).UniqueID ] },
{ "Email", Request[ (editItem.FindControl("Email") as TextBox).UniqueID ] },
{ "IsApproved", Request[ (editItem.FindControl("IsApproved") as CheckBox).UniqueID ] == "on" },
{ "IsLockedOut", Request[ (editItem.FindControl("IsLockedOut") as CheckBox).UniqueID ] == "on" }
};
var x1 = dataUpdate["UserName"]; // this is corrent new value from Request
var x2 = (editItem.FindControl("UserNameNew") as TextBox).Text; // this is WRONG! OLD! value from TextBox ... Why???
using (Entities entities = new Entities())
{
aspnet_Membership membershipItem = entities.aspnet_Membership.Where(MBS => MBS.UserId == userId).FirstOrDefault();
membershipItem.Email = dataUpdate["Email"].ToString();
membershipItem.LoweredEmail = membershipItem.Email.ToLower();
membershipItem.IsApproved = Convert.ToBoolean(dataUpdate["IsApproved"]);
membershipItem.IsLockedOut = Convert.ToBoolean(dataUpdate["IsLockedOut"]);
entities.SaveChanges();
aspnet_Users userItem = entities.aspnet_Users.Where(USR => USR.UserId == userId).FirstOrDefault();
userItem.UserName = dataUpdate["UserName"].ToString();
userItem.LoweredUserName = userItem.UserName.ToLower();
entities.SaveChanges();
}
AdminUsersListView.EditIndex = -1;
AdminUsersListView.DataSource = _getDataList();
AdminUsersListView.DataBind();
谢谢,艺术
答案 0 :(得分:2)
我知道答案...... F *** ING VIEWSTATE !!!
请注意这一点! 要始终实际获取数据,您需要将EnableViewState设置为“False”。
<%@ Page EnableViewState="False"
Language="C#"
MasterPageFile="~/App_Masters/Admin.Master"
AutoEventWireup="true"
CodeBehind="Users.aspx.cs"
Inherits="WebShop.Admin.Users" %>
诀窍是仅仅为特定输入设置它是不够的!这只是在我为ASPX中的整个页面设置了这个之后帮助了我。