Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > Передача динамического набора параметров


Автор: Vit 28.4.2007, 18:02
Мне надо на другую страницу передать по сути массив значений, например список картинок которые надо показать. Их количество может быть во-первых разным, а во вторых достаточно большим... Вроде как писать что-то типа 

"MyPage.aspx?img1=a&img2=sdf&img3=... 

Маразм... Конечно можно через базу данных, сначала засунуть туда этот список, а потом передать id и получить этот список из базы, но это вроде как через одно место... И как это по нормальному реализовать?

Автор: Sartorius 28.4.2007, 18:03
 <удалил>

Автор: 6atoh 28.4.2007, 18:41
Для передачи строковых данных между страницами, можно использовать Session, ViewState, hidden fields.

Автор: Mymik 28.4.2007, 20:51
А еще можно делать через PostBackUrl (это свойство у asp:Button есть)
А на ту страницу куда передаешь можно достать значение через
Код

if (PreviousPage != null)
{
    TextBox txtName = (TextBox) PreviousPage.FindControl("txtName");
}

Автор: Vit 28.4.2007, 22:53
Цитата(Mymik @  28.4.2007,  11:51 Найти цитируемый пост)
TextBox txtName = (TextBox) PreviousPage.FindControl("txtName");



Не ищет, если контрол находится в таблице...

Автор: a.S.d 28.4.2007, 23:10
Vit, Если таблица - серверный контрол, то искать надо через <table ID>.FindControl().

Автор: Vit 29.4.2007, 03:22
Цитата(a.S.d @  28.4.2007,  14:10 Найти цитируемый пост)
Vit, Если таблица - серверный контрол, то искать надо через <table ID>.FindControl().



не-а... получается что надо искать в каждой клетке отдельно...

Автор: dazy 29.4.2007, 07:38
Цитата(Vit @  29.4.2007,  06:22 Найти цитируемый пост)
не-а... получается что надо искать в каждой клетке отдельно... 


Можно искать для каждой строки отдельно.

Код

Text = (GridView1.Rows[e.RowIndex].FindControl("TBQuestion") as System.Web.UI.WebControls.TextBox).Text;


Но правда это вызывается на этой же странице и в событии самого GridView1. Может поэтому находится конрол.

Автор: Mymik 29.4.2007, 07:58
dazy, это ищется в конкретном объекте. Но в Child node'ах оно не будет искаться.

Вообще, если посидеть и немного подумать, то становиться понятным почему оно не будет искать контролы в child'ах. Хотя бы потому что слишком велика вероятность наличия одинаковых ID. И потому оно ищется только лишь в данном объекте. Если тебе нужно обратиться к какому-нибудь user-web-control и там найти объект этого checkbox'а... тогда тебе прийдется найти сначала этот контрод, а после него искать дальше свой контрол уже внутри первого.


Цитата(Vit @  29.4.2007,  03:22 Найти цитируемый пост)
не-а... получается что надо искать в каждой клетке отдельно... 

Найди таблицу, а в ней ищи нужные тебе контролы.

Автор: Mymik 29.4.2007, 08:22
Vit, Если тебе не удобно через FindControl тогда сделай через Reflaction
Default.aspx
Код

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        First Name: <asp:TextBox ID="txtName" runat="server" /><br/>
        Last Name: <asp:TextBox ID="txtLastName" runat="server" /><br/>
        Email: <asp:TextBox ID="txtEmail" runat="server" /><br/>
        <asp:Button PostBackUrl="~/Default2.aspx" Text="Click Me" runat="server" />
    </div>
    </form>
</body>
</html>

Behind Code: (Мы тут определяем метод, который будет забирать данные с нашей страницы)
Код

    protected void Page_Load(object sender, EventArgs e)
    {

    }
    public Dictionary<string, string> GetTextBoxValue()
    {
        Dictionary<string, string> user = new Dictionary<string, string>();
        user.Add("Username", txtName.Text.Trim());
        user.Add("LastName", txtLastName.Text.Trim());
        user.Add("Email", txtEmail.Text.Trim());

        return user;
    }


Когда Aspx Файла Default2.aspx не привожу, потому как он пустой.
А вот behind Code привожу
Код

    protected void Page_Load(object sender, EventArgs e)
    {
        if (PreviousPage != null)
        {
            /* Создания */
            Dictionary<string, string> user = new Dictionary<string, string>();
            /* Получаем описание метода, и вызываем его */
            user = (PreviousPage.GetType().GetMethod("GetTextBoxValue").Invoke(PreviousPage, null) as Dictionary<string, string>);
            /* Добавляем на странице текстовые Node'ы */
            Page.Controls.Add(new LiteralControl("Username:" + user["Username"] + "<br/>"));
            Page.Controls.Add(new LiteralControl("LastName:" + user["LastName"] + "<br/>"));
            Page.Controls.Add(new LiteralControl("Email:" + user["Email"] + "<br/>"));
        }
    }

Тут это делается немного легче (хотя это ИМХО каждого)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)