3

ИдеяВосстановление выпадающий выбранного элемента после обратной передачи

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

ПРОБЛЕМА

Real выбранное значение не передается в параметр строки запроса, это всегда «0». DropDownList никогда не получает последний выбранный элемент, он всегда восстанавливает тот, который сохраняется в ViewState. ViewState не хочет запоминать новый материал, он всегда хранит одну и ту же информацию. Я пытался найти решение в течение нескольких месяцев. На некоторых страницах это работает, но в большинстве случаев это не так. Если он работал где-то в моем веб-приложении, я совершенно не знал, почему и надеялся, что он продолжит работу на следующий день. Иногда он просто переставал работать, и я не мог это исправить.

DEFAULT ASPX PAGE

<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="ExperimentalPage.aspx.cs" 
Inherits="ExperimentalPage" Title="Enperimental Page" EnableViewState="True" %> 

<asp:Content ID="ExperimentalLeftPane" ContentPlaceHolderID="cph_LeftPane" Runat="Server"> 
    <div style="position: absolute; left: 0px; top: 35px; width: 250px;"> 
     <asp:DropDownList ID="dd1" runat="server" OnSelectedIndexChanged="RefreshPage" AutoPostBack="True" CssClass="class_DropDown" Style="width: 250px; margin-bottom: 3px;"/> 
    </div> 
</asp:Content> 

DEFAULT ASPX.CS КОД-ЗА СТР

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     dd1.Items.Insert(0, "dd1-0"); 
     dd1.Items[0].Value = "0"; 
     dd1.Items.Insert(1, "dd1-1"); 
     dd1.Items[1].Value = "1"; 
     dd1.Items.Insert(2, "dd1-2"); 
     dd1.Items[2].Value = "2"; 
    } 
    else   
    { 
     dd1.SelectedIndex = dd1.Items.IndexOf(dd1.Items.FindByValue(Convert.ToString(Request.QueryString["dd1"]))); 
    } 
} 

protected void RefreshPage(object o, EventArgs e) 
{ 
    Page.Response.Redirect("ExperimentalPage.aspx?" 
    + "&dd1=" + dd1.SelectedValue); 
} 

ПОПЫТКИ ДЕЛАЮТ ЭТО РАБОТАЕТ

Сценарий 1. EnableViewState = "Правда"

Я выбираю третий элемент (со значением «2») выпадающего списка, перезагружает страницу. Строка запроса никогда не принимает значение «2». Он всегда «0». Первый элемент всегда выбирается после обратной передачи, возможно, из-за ViewState, который сбрасывает его.

Сценарий 2. EnableViewState = "False"

Выбранное значение не сохраняется. DropDownList полностью пуст после обратной передачи.

Сценарий 3. EnableViewState = "False". Раскрывающийся список заполняется данными о каждой загрузке страницы. Postback проверяется только для получения выбранного значения:

protected void Page_Load(object sender, EventArgs e) 
{ 
    //if (!Page.IsPostBack) 
    //{ 
     dd1.Items.Insert(0, "dd1-0"); 
     dd1.Items[0].Value = "0"; 
     dd1.Items.Insert(1, "dd1-1"); 
     dd1.Items[1].Value = "1"; 
     dd1.Items.Insert(2, "dd1-2"); 
     dd1.Items[2].Value = "2"; 
    //} 
    //else  
    if (Page.IsPostBack) 
    { 
     dd1.SelectedIndex = dd1.Items.IndexOf(dd1.Items.FindByValue(Convert.ToString(Request.QueryString["dd1"]))); 
    } 
} 

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

ОДИН БОЛЬШОЙ ВОПРОС

Что мне не хватает, и как сделать это сохранить выбранное значение и восстановить его после обратной передачи?

ПРОБЛЕМА ЧАСТИЧНО РЕШИЛИ

Смотрите мой ответ

+0

когда вы называете функцию RefreshPage? –

+0

Посмотрите на ** код ASPX PAGE **. Это метод для DropDownList. – SWA

ответ

2

Хорошо, я понял, как это исправить. Если кому-то это нужно, это решение.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     dd1.Items.Insert(0, "dd1-0"); 
     dd1.Items[0].Value = "0"; 
     dd1.Items.Insert(1, "dd1-1"); 
     dd1.Items[1].Value = "1"; 
     dd1.Items.Insert(2, "dd1-2"); 
     dd1.Items[2].Value = "2"; 
    }  
} 

protected void RefreshPage(object o, EventArgs e) 
{ 
    Session["dd1"] = dd1.SelectedValue;  
    dd1.SelectedIndex = dd1.Items.IndexOf(dd1.Items.FindByValue(Convert.ToString(Session["dd1"]))); 
} 

В этом решении EnableViewState страница свойство Правда. Нет перенаправления страницы. Строка запроса не используется. Вместо этого используется переменная Session. Это хороший способ сохранить значения во время обратной передачи.

1

При выборе элемента из выпадающего списка, вы попали в Page_Load() до RefreshPage() метода

Это означает, что вы будете выполнять этой линии до метода RefreshPage:

dd1.SelectedIndex = dd1.Items.IndexOf(dd1.Items.FindByValue(Convert.ToString(Request.QueryString["dd1"]))); 

Convert.ToString (Request.QueryString [ "DD1"])) оценит нулевое значение, таким образом SelectedIndex будет установлен в 0.

Если вы хотите, чтобы сделать эту работу, вы должны попробовать следующее:

if (!Page.IsPostBack) 
{ 
    dd1.Items.Insert(0, "dd1-0"); 
    dd1.Items[0].Value = "0"; 
    dd1.Items.Insert(1, "dd1-1"); 
    dd1.Items[1].Value = "1"; 
    dd1.Items.Insert(2, "dd1-2"); 
    dd1.Items[2].Value = "2"; 

    if (!string.IsNullOrEmpty(Request.QueryString["dd1"])) 
    { 
     dd1.SelectedIndex = dd1.Items.IndexOf(dd1.Items.FindByValue(Convert.ToString(Request.QueryString["dd1"]))); 
    } 
} 
+0

Хорошо, но что изменится? В любом случае эта модификация не будет выполнена после page_load. Это просто еще одна проверка. Однако основная проблема не решена. – SWA

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