Как хранить таблицу данных для редакции пользователя (перед сохранением в базе данных)? - PullRequest
0 голосов
/ 18 января 2011

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

То есть ситуация, когда у вас есть GridView или элемент управления на его основе, такой как RadGrid, и вы хотите отслеживать таблицу данных при добавлении, редактировании, переупорядочении и удалении строк.

Использование сеанса для хранения таблицы данных (или списка данных) может быть не лучшим решением, потому что пользователь может открыть две идентичные веб-страницы ... Использование ViewState для хранения данных может быть и вариант ... У меня есть использовал подход, подобный следующему:

public partial class DefaultPage : System.Web.UI.Page
{
    protected DataLine DefaultDataLine()
    {
        DataLine dl = new DataLine();

        dl = new DataLine();
        dl.Number = 0;
        dl.Title = "";
        dl.Text = "";
        return dl;
    }

    protected class DataLine
    {
        public int Number { get; set; }
        public string Title { get; set; }
        public string Text { get; set; }
    }

    protected static List<DataLine> tempLines;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            tempLines = RadGridBindStartUpData();
        }
    }

    protected void RadGrid1_NeedDataSource(object source, Telerik.Web.UI.GridNeedDataSourceEventArgs e)
    {
        RadGrid1.DataSource = tempLines;
    }

    protected void RadGrid1_InsertCommand(object source, Telerik.Web.UI.GridCommandEventArgs e)
    {
        GridEditableItem editedItem = e.Item as GridEditableItem;

        List<DataLine> table = tempLines;

        DataLine newRow = new DataLine ();

        RadTextBox rtb;   
        rtb = (RadTextBox)editedItem.FindControl("RadTextBoxTitle");
        newRow.Title = rtb.Text;
        rtb = (RadTextBox)editedItem.FindControl("RadTextBoxDescription");
        newRow.Description = rtb.Text;

        RadNumericTextBox number =  (RadNumericTextBox)editedItem.FindControl("RadNumericTextBoxNumber");
        newRow.Number = number.Value.HasValue ? Convert.ToInt32(number.Value.Value) : 0; 

        table.Add(newRow); 
    }

    // ...

Таким образом, используя статическую переменную List пользовательского объекта (класса), объявленного в выделенном коде страницы Aspx, и обновляя ее при каждом редактировании данных.

Что вы думаете об этом подходе? Это нормально? Как вы храните данные в формате таблицы для издания (до сохранения в базе данных)?

Ответы [ 4 ]

1 голос
/ 18 января 2011

Это зависит от того, чего вы хотите достичь

Viewstate сохранит данные на этой странице - они не будут доступны на других страницах (или вкладках, или окнах)

Сеанс будет хранить данные на сервере, это означает, что они будут доступны для любой страницы, которую просматривает пользователь (на вашем сайте), и будут сохранять ее до истечения времени сеанса . .

Есть много преимуществ / недостатков в любом из этих методов, поэтому вам нужно исследовать вашу ситуацию, вот начало .

1 голос
/ 18 января 2011

Вы упомянули хранение в сеансе и как это может вызвать проблемы, если пользователь открывает несколько копий страницы и т. Д. *

У нас была похожая проблема, поэтому я сделал свойство в коде на странице и при первой загрузке страницы (если не постбэк-бла-бла) я генерирую новый guid. Затем я использую значение guid в качестве сеансового ключа и знаю, что оно будет уникальным для каждой страницы.

Вы можете создать свойство spify, как это ...

Public ReadOnly Property SessionDataKey() As String
    Get
        If ViewState("SessionDataKey") Is Nothing Then
            ViewState("SessionDataKey") = Guid.NewGuid()
        End If

        Return ViewState("SessionDataKey").ToString()
    End Get
End Property

Но вкратце, я просто использую сеанс.

1 голос
/ 18 января 2011

Не совсем уверен, что вы собираетесь, но использование статической переменной, вероятно, не , что вы хотите сделать. Статические свойства являются общими для всех пользователей / потоков, поэтому все одновременные пользователи будут редактировать одни и те же данные.

Если вы просто хотите сохранить небольшой набор данных между постбеками на одной странице, используйте вместо этого ViewState. Просто помните о возможных проблемах с производительностью, если вы планируете загружать в него большое количество данных.

0 голосов
/ 03 февраля 2011

Большое спасибо за ваши ответы!С вашей помощью и некоторыми исследованиями я вижу, что оба подхода, хранение в сеансе или использование статической переменной, действительно неверны, по крайней мере, для той цели, которой я их использовал ... Все ваши ответы были полезны, и хотя я могу только отметитьодин, как правильно, я хотел бы оставить свою оценку.

Ну, для тех, кто сталкивается с той же проблемой, вот что я реализовал на своих страницах:

public partial class ScriptAdd : System.Web.UI.Page
{
    private List<MyItem> tempMyItems
    {
        get
        {
            //if (ViewState["tempMyItemsList"] == null)
            //    ViewState["tempMyItemsList"] = new List<MyItem>();

            return (List<MyItem>)ViewState["tempMyItemsList"];
        }
        set
        {
            ViewState.Add("tempMyItemsList", value);
        }
    }        

    protected void Page_Load(object sender, EventArgs e)
    {
        // ...
    }
}

И затем используйте это всякий раз, когда я хочу добавить / вставить / обновить строки вмой временный список:

        List<MyItem> table = tempMyItems;

        table.RemoveAt(idx);

        MyItem newRow = new MyItem ();

        // ...

        table.Insert(idx, newRow);

Наконец, если нужно, я сохраняю все элементы в базе данных.

...