Входные данные внутри ListView не изменяют значения со старых на недавно установленные в событии ItemUpdating - PullRequest
1 голос
/ 04 января 2011

Буду признателен, если кто-нибудь поможет мне разобраться в этой ситуации.Я не знаю почему, но когда я редактирую выбранный элемент ListView (содержащий несколько текстовых ящиков), а затем нажимаю кнопку Обновить в событии ItemUpdating, я всегда получаю старые значения вместо тех, которые были набраны недавно.Почему?

  1. Я не использую событие Page_Load, поэтому мне не нужно проверять PostBack
  2. Я пытаюсь получить значение, прежде чем связать данные из БД в ListView, поэтомуНевозможно переопределить недавно введенные значения
  3. Я пытался получить значения TextBoxes в разных обработчиках событий - ItemCommand, ItemUpdating, ItemDataBound - результат всегда одинаковдумаю, это потому, что я не использую элемент управления SqlDataSource)
  4. Единственный способ получить новые значения - это проверить запрос, но в этом случае я не могу использовать валидаторы элемента управления ... так что, вероятно, этоплохая идея работать только с запросом.

Это код метода 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();

Спасибо, Art

1 Ответ

2 голосов
/ 06 января 2011

Я знаю ответ ... 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...