• Привет, Гость!
  • Войти
  • Регистрация
  • Записи
  • Форумы
  • Люди
  • Файлы
  • Работа
  • Технологии

FAQ по форуму ASP.NET

Все форумы  Поиск  Правила  Помощь 
 Активные темы  Темы без ответов
Привет, гость! Войти
Форумы GotDotNet.Ru » ASP.NET WebForms » FAQ по форуму ASP.NET
Страницы: Пред. 1 2 3 След.
RSS
[ Закрыто ] FAQ по форуму ASP.NET
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#26
17.07.2003 22:06
Вопрос

Как определить версию .NET Framework, используемой Web-сайтом?

Ответ

Выполните последовательность:

http://uneta.russia.webmatrixhosting....ide.html#3
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#27
17.07.2003 22:07
Вопрос

Возможно ли осуществить привязку Web-приложения к определенной версии .NET Framework?

Ответ

Попробуйте воспользоваться советом:

http://uneta.russia.webmatrixhosting....ide.html#2
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#28
17.07.2003 22:09
Вопрос

Хочу, чтобы Web-приложение работало c версией 1.0 .NET Framework. при наличии установленной версии 1.1.

Ответ

http://uneta.russia.webmatrixhosting....ide.html#1
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#29
17.07.2003 22:10
Вопрос

Почему не установился IIS 6.0 при установке Windows Server 2003? Что мне нужно сделать чтобы запустить службу IIS?

Ответ

Есть несколько вариантов запуска сервиса IIS после установки операционной системы. Подробнее прочитайте здесь

http://uneta.russia.webmatrixhosting....ngasp.html
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#30
17.07.2003 22:11
Вопрос

Как предотвратить выполнение скрипта злоумышленника, передаваемого со страницей-запросом?

Ответ

Для предотвращения подобных атак, когда злоумышленник внедряет свой код в данные поступающие со страницы, используйте:
<%@ Page validateRequest="true"%>

В случае, когда это нежелательно, проверяйте _все_ данные поступающие со страницы. Установите "validateRequest" в "false" и используйте Server.HtmlEncode(string) и Server.HtmlEncode(string).

Подробности:
http://uneta.org/Default.aspx?mnuid=B...C77405B470
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#31
17.07.2003 22:11
Вопрос

Как получить значение из скрытого HTML-поля (<INPUT type="hidden" id="tbID">) в обработчике события серверного элемента управления.

Ответ

Необходимо указать атрибут «runat» Например так:

<INPUT type="hidden" id="tbID" runat="server"> 
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#32
17.07.2003 22:12
Вопрос

Что содержит «_ViewState»?

Ответ

«__VIEWSTATE» используется для хранения разницы между значениями назначенными элементам управления и значениями полученными в результате выполнения, непосредственно перед отображением. Данные во «__VIEWSTATE» не зашифрованы, они получены в результате сериализации элементов управления. Для того, чтобы увидеть вклад каждого элемента управления во «__VIEWSTATE» можно воспользоваться следующим кодом, включающим вывод отладочной информации:
<%@ Page Language="VB" Trace="True" %>

Таблица, выводимая внизу страницы, позволит оценить размер данных, используемый для сохранения данных элемента управления. Заметьте, что есть возможность запретить использование «__VIEWSTATE» как для страницы целиком, так и для отдельных элементов. Например, следующий код:
<%@ Page Language="VB" MaintainState="False" %>


окажет влияние на всю страницу, а для манипуляции свойствами элементов управления, можно воспользоваться таким кодом:
<asp:datagrid id="MyGrid1" maintainstate="false" runat=server/>


Старайтесь минимизировать размер передаваемого «__VIEWSTATE».
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#33
17.07.2003 22:13
Вопрос

Как получить доступ к файлам расположенным на сетевых дисках, используя учетные данные пользователя отличного от контекста страницы?

Ответ

В этом случае придется самому имперсонировать пользователя под разными credentials, используя LogonUser API. Но при этом потребуется дать привиллегию "Act as part of the operating system" для учетной записи, из под которой производятся вызовы. Не рекомендуется эти права предоставлять учетной записи ASPNET. Возможным вариантом может быть обращение через COM+ приложение в отдельном процессе (Server) под аккаунтом с нужной привелегией для вызовов LogonUser API.

Пример использования Login API.

После успешного выполнения функции LogonUser, token будет содержать token-объект конкретного пользователя, на основе которого можно создать объект WindowsIdentity, а с ним -- подменить пользователя под которым выполняется процесс.
using System; 
using System.Security.Principal; 
using System.Runtime.InteropServices; 
namespace MyFunctions.Security 
{ 

public class Impersonation 
{ 
	#region WinAPI functions 
	const int LOGON32_LOGON_INTERACTIVE = 2; 
	const int LOGON32_PROVIDER_DEFAULT = 0; 
	WindowsImpersonationContext impersonationContext; 
	 [DllImport("advapi32.dll", CharSet=CharSet.Auto)] 
	static extern int LogonUser(String lpszUserName, 
	String lpszDomain, String lpszPassword, 
	int dwLogonType, int dwLogonProvider, ref IntPtr phToken); 
	 [DllImport("advapi32.dll", CharSet=CharSet.Auto,
SetLastError=true)] 
	extern static int DuplicateToken(IntPtr hToken, 
	int impersonationLevel, ref IntPtr hNewToken); 
	#endregion 

public bool Impersonate(string strUserName,string 
	strPassword,string strDomain) 
{
	return impersonateValidUser(strUserName,strDomain,strPassword); 
} 

public void undoImpersonation() 
{ 
	impersonationContext.Undo(); 
} 

private bool impersonateValidUser(String userName, 
	String domain, String password) 
{
	WindowsIdentity tempWindowsIdentity; 
	IntPtr token = IntPtr.Zero; 
	IntPtr tokenDuplicate = IntPtr.Zero; 
	if( LogonUser(
		 userName
		,domain
		,password
		,LOGON32_LOGON_INTERACTIVE
		,LOGON32_PROVIDER_DEFAULT
		,ref token
) != 0)
	{ 
		if( DuplicateToken(token, 2, ref tokenDuplicate) != 0 ) 
		{
			tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
impersonationContext = tempWindowsIdentity.Impersonate();
if ( impersonationContext != null )
return true;
else 	return false; 
		} 
		else	return false; 
	} //  if LogonUser...
	else return false; 
}
} 
} //  namespace

P.S. Судя по вопросу, рассматирвается Internet сценарий (Иначе можно было бы воспользоваться Integrated/IIS/ и Windows/ASP.NET/ аутентификацией). Если не устраивает Basic/IIS/ - используются свои формы, то в IIS выставляем Anonymous и в ASP.NET - Forms аутентификацию.Подробно про Forms аутентификацию читайте: http://msdn.microsoft.com/library/def...frame=true

Если коротко, то в Logon.ASPX проверяется пользователь и создается аутентификационныйticketзашифрованный cookie. В данном случаепридется хранить в нем и UserID и пароль. Затем, в событии Application_AuthenticateRequest, необходимо дешифровывать этот ticket, разобрать и сделать имперсонацию под нужным пользователем через Logon API. Здесь и пригодится код, приведенный в качестве примера.

Но конструкция действительно не очень хорошая. Дело не в unmanaged вызовах, а в "Act as part of the operating system" Если нужно просто ограничить доступ к ASPX страницам, то следует использовать возможность URLAuthorizationModule через установки в web.config для соответсвующих подкаталоговприложения. Например:
<authorization> 
<deny users="*" /> 
<allow roles="Admins" /> 
</authorization> 

При такой схеме можно хранить имена пользователей, например, в базе данных. В Application_AuthenticateRequestможноработать с GenericIdentity и GenericPrincipal.
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#34
16.12.2003 12:29
Вопрос

Как разбить данные выводимые DataList или Repeater на страницы

Ответ

Как один из вариантов, можно использовать класс PagedDataSource.

Допустим, некий метод ReturnDataSource(), возвращает DataSet.

В DataSet несколько таблиц.

Объявимв классе страницы переменную:

protected PagedDataSource pds;

В методе Page_Init:

// создаем объект
pds = new PagedDataSource();

// инициализируем его свойство DataSource
pds.DataSource = ReturnDataSource().Tables[2].DefaultView;

// используем разделение на страницы
pds.AllowPaging = true;

// количество Items на странице
pds.PageSize = 20;

Далее, ту страницу, которую будем отображать, устанавливаем при помощи свойства CurrentPageIndex. Количество страниц можно определить из свойства PageCount.

И, наконец:

Repeater1.DataSource = pds;
Repeater1.DataBind();


Автор Евгений Веприков
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#35
23.12.2003 11:01
Вопрос

DataGrid. Как получить Primary Key строки DataGrid, в которой произошло событие ItemCommand?

Ответ

Сначала, перед привязкой DataGrid, установить свойство:

DataKeyField = ”Имя столбца PK” 

Далее, в обработчике события, значение ключа получаем из:

DataGrid.DataKeys[e.Item.ItemIndex]
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#36
23.12.2003 11:35
Вопрос

Как сменить язык страницы, например, чтобы месяц в календаре отображался на указанном языке?

Ответ

Календарь автоматически отображается на текущем языке приложения.

Чтобы установить текущй язык приложения необходимо проинициализировать объект CultureInfo текущего потока:

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(“ru-RU”); // Русский язык. 

Это присвоение удобно делать в Load формы, но на самом деле важно, чтобы оно произошло до события Render.
Кроме того, прочтите еще одну статью в FAQ:
На странице вместо русского текста непонятные символы. Не передаются русские буквы методом post!
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#37
23.12.2003 11:45
Вопрос

Как передать данные из одной формы в другую?

Ответ

Обычно вопрос возникает в связи с тем, что форма не открывает другую страницу, как это было в ASP, с помощью атрибута Action тега Form. В ASP.NET, после отправки данных формы, должна открыться та же страница, к которой форма принадлежит, чтобы можно было восстановить состояние контролов и обработать события. По-этому, для того чтобы открыть новую форму, предпочтительнее использовать метод Transfer класса HttpServerUtility. Как передать данные между формами в этом случае подробно описано здесь. http://msdn.microsoft.com/library/def...npages.asp
Кроме того, для передачи данных можно использоваьть переменные сессии, как описано здесь.
http://msdn.microsoft.com/library/def...isualc.asp
Не стоит забывать о традиционных для ASP методах передачи параметров: коллекции Request.Form и Request.QueryString (в ASP.NET появилась коллекция Request.Params, объединяющая обе перечисленные и еще Request.Cookies и Request.ServerVariables. Существует перегруженная версия метода Transfer с двумя параметрами – url новой страницы и bool значение, которое задает сохранять ли QueryString и Form коллекции оригинального запроса. Если установить его true, то тогда значение контролов первой формы можно будет получить в странице назначения, обратившись к коллекции с ключом ID интересующего контрола.
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#38
23.12.2003 11:54
Вопрос

ASP.NET 2.0 Как установить фокус на определенный элемент управления при загрузке aspx-страницы?

Ответ

В ASP.NET 2.0 для установки фокуса появился метод Page.SetFocus(Control control). На стороне клиента должен быть разрешен client-side
scripting.

В ASP.NET 1.x можно воспользоваться клиентским скриптом:

const string SET_FOCUS = "<script language=JavaScript>document.all.IdOfControlToFocus.focus();</script>";
RegisterStartupScript( "myTextBox_setfocus", SET_FOCUS);


Вместо IdOfControlToFocus необходимо указать Id интересующего контрола.

Небольшой обзор способов установки фокуса.
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#39
23.12.2003 14:36
Вопрос

Доступ к файлам. Как предоставить файл только зарегистрированному пользователю?

Ответ

Допустим, что файл хранится в недоступной пользователю папке.

И пользователю предоставляется подобным запросом:

<A href="about:это, всего-лишь, пример запроса">http://site.ru/MyApp/GetFile.aspx?FileName=file.dat</A>

Создадим HttpHandler:
public class MyHttpHandler : IHttpHandler 
{ 
public bool IsReusable { get { return true; } }
public void ProcessRequest( HttpContext context ) 
{ 
// получаем из запроса имя файла 
string strRequestedFile = context.Request.QueryString[ "FileName" ]; 
// открываем файл с полученным именем
FileStream stmFileStream = new FileStream( @"D:\MySecureFolder\" + strRequestedFileName, FileMode.Open ); 
// заполняем буфер содержимым файла
byte[] buffer = new byte[ stmFileStream.Length ]; 
stmFileStream.Read( buffer, 0, buffer.Length ); 
stmFileStream.Close();
// отправляем содержимое буфера клиенту 
context.Response.ContentType = "application/octet-stream";
context.Response.OutputStream.Write( buffer, 0, buffer.Length ); 
} // ProcessRequest
} // MyHttpHandler

Затем,в web.config, укажем:
<configuration>
<system.web> 
  <httpHandlers>
<add verb="GET" path="GetFile.aspx" type="MyHttpHandler, MyAssembly" /> 
  </httpHandlers> 
 </system.web> 
</configuration>

При использовании приведенной выше информации, следует учитывать:

  1. Необходимопроверять имя файла в запросе.В приведенномпримере злоумышленник может использовать в запросе конструкции типа"..\..\" и, таким образом, потенциальную возможность получить несанкционированный доступ к ресурсам сервера.
  2. Свойство Response.ContentType. Его значение зависит от того, что Высобираетесь передавать.
  3. Необходимо обрабатывать исключения, связанные с открытием файла. Стоит подумать о размещении операторов работы с файломв using-блоке.
  4. Следует учитывать размер данных передаваемых клиенту. В случае если размер значительный, стоит передавать данные не целиком, а частями.
  5. Свойство IsReusable указывает среде исполнения на возможность повторного использования обработчиказапросов. То есть, когда придет следующий запрос, среда не будет создавать новый объект MyHttpHandler, а использует этот-же повторно.
  6. Элемент"httpHandlers/add" добавляет обработчик HTTP-запросов. В данном случае все GET-запросы на файл GetFile.aspx будут перенаправляться указанному обработчику. И не важно, существует ли этот файл на самом деле.

© Федор Сойкин (Name)
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#40
23.12.2003 16:42
Вопрос

Что такое <%# %>, <% %>, <%= %> и <script runat=”server”> </script>?

Ответ

  1. <%# %> data-binding expression
  2. <% %> code render block
  3. <%= %> code declaration block
  4. <script runat=”server”> </script>server code declaration block

Блок <%# %> называется data-binding expression – выражение привязки к данным. Код из этих блоков используется в методах-обработчиках события DataBinding элемента, в теле которого блок был объявлен. Код этого метода выглядит в общем случает так:
public void __DataBind__controlX(object sender, System.EventArgs e){	//  Объявляется переменная Container. Тип переменной зависит от
	//  того, в теле какого элемента используется выражение привязки.
	//  В данном случае, привязка осуществляется в ItemTemplate элемента
	//  DataGrid, для него атрибутом TemplateContainerAttribute был 
	//  установлен класс контейнера DataGridItem. Если привязка 
	//  происходит не в шаблоне, то тип переменной Container всегда
	//  будет System.Web.UI.Control.
	//
	System.Web.UI.WebControls.DataGridItem Container;	//
	//  Объявляется переменная target. Это объект, в теле которого
	//  используется блок привязки. Для шаблона, target - всегда
	//  DataBoundLiteralControl.
	//
	System.Web.UI.DataBoundLiteralControl target;	//  инициализация переменных.
	target = ((System.Web.UI.DataBoundLiteralControl)(sender));
	Container = ((System.Web.UI.WebControls.DataGridItem)(target.BindingContainer));
	//  выполнение кода привязки. 
	target.SetDataBoundString(0, (System.Convert.ToString(/*содержимое блока <%# %>*/));
	//  Если в коде страницы привязка была использована в виде 
	//  attributeName=’<%# someExpr %>’, то предыдущий код будет выглядеть иначе:
	//
	//  target.attributeName = ((<ожидаемый тип атрибута>)(someExpr));
	//
}


В теле блока <%# %> можно свободно использовать переменные Container и target. Следует помнить, что объявленные в странице свойства или поля с такими именами будут перекрыты этими переменными в коде блока привязки данных.

Блок <% %> и <%= %> называется code render block – блоки отображения. Код из этих блоков складывается в методы-делегаты вызываемые на стадии Rendering тех элементов, внутри которых данные блоки были размещены разработчиком. Первый блок предназначен для внедрения в страницу кода, который можно выполнить на этой стадии, и вовсе не обязательно должен как-то сказаться на итоговом ее соджержимом, второй используется в виде <%= someExpr %> является сокращением <% Response.Write(someExpr) %>. Здесь someExpr – это любое выражение, которое будет обработано методом Write() класса HtmlTextWriter. В теле блока <% %> допустимо объявлять переменные, тогда они будут локальными для того метода, в котором данный блок будет реализован. В теле блока <% %> нельзя объявлять методы или типы.
Блок <script runat=”server”> </script> называется server code declaration block – блок объявления кода. Содержимое данных блоков ASP.NET добавляет в объявление класса страницы, при создании итоговой dll, соответственно в коде блока должны быть только объявления методов, переменных, и классов, которые будут доступны в коде всей страницы. Поскольку данный код содержится в классе, наследуемом от класса страницы, объявленного в code-behind файле (или непосредственно от System.Web.UI.Page), здесь можно переписывать объявления виртуальных методов/свойств родительского класса.
Код во всех блоках выполняется в области видимости страницы: т.о. еслибудет написано <% SomeProp = “SomePropValueStr” %> свойство SomeProp должно быть объявлено либо здесь же, в странице, с помощью блока объявления кода, и тогда область видимости SomeProp может быть любой, либо в code-behind файле, и тогда область видимости SomeProp должна быть не меньше Protected.
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#41
23.12.2003 18:10
Вопрос

Свойство ID элементов в шаблонных столбцах переустанавливается в значение по-умолчанию. Почему?..

Ответ

В результате такие методы как FindControl(ID) возвращают нулевое значение, что в дальнейшем приводит к нежелательным исключениям. Почемуэто происходит?
У всех элементов управления, предназначенных для отображения списков данных с поддержкой шаблонов: Repeater, DataList, DataGrid, контейнер, в котором создаютсяэлементы из шаблонов, единый для всех видов шаблонов. Т.е. все элементы, которые находятся в ItemTemplate, AlternatingItemTemplate, EditItemTemplate и SelectedItemTemplate находятся в одном INamingContainer, и дизайнер отслеживает, чтобы элементы с одинаковым ID в нем не встречались.При заданииэлементу ID, такого же, как усуществующего,происходит замена значения в ID существующего элементана значение по-умолчанию, несмотря на то, что в run-time невозможна ситуация,когда для одной строки создаются два разныхшаблона одновременно.
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#42
21.01.2004 9:01
Вопрос

Как добавить собственный параметр в web.config и считать его.

Ответ

создаем параметр в web.config

<configuration>
 <appSettings>
 <add key="ConnectionString" value="data source=localhost;Initial Catalog=pubs;user id=sa;Password=;"/>
 </appSettings> 
...
</configuration>


получаем параметр из web.config :

strConn = ConfigurationSettings.AppSettings("ConnectionString")


Кроме того, прочитайте статью "Обработка собственных секций в конфигурационном файле".
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#43
23.01.2004 14:21
Вопрос

Как автоматически аутентифицировать доменных пользователей в локальной сети и выводить приглашение для остальных?

Ответ

Укажитев web.config режим "Windows"для аутентификации:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<authentication mode="Windows" /> 
...
</system.web>
</configuration>


В "IIS Administration",вкладка "Security", для каталога приложения, укажите "basic" и "Windows Integrated".
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#44
14.05.2004 15:03
Вопрос

Как программно создать ItemTemplate в System.Web.UI.WebControls.DataGrid?

Ответ

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace tests
{
public class WebForm5 : System.Web.UI.Page
{
 protected System.Web.UI.WebControls.PlaceHolder PlaceHolder1;

 private void Page_Load(object sender, System.EventArgs e)
 {
 ///создаем DataGrid
 DataGrid dg=new DataGrid();
 ///помещаем его на страницу
 PlaceHolder1.Controls.Add(dg);
 ///создаем объект класса TemplateColumn
 TemplateColumn tc=new TemplateColumn();
 ///инициализируем его свойство HeaderText,
 ///при необходимости инициализируем остальные свойства 
 tc.HeaderText="Наименование";
 ///ВАЖНО! Неоходимо инициализировать хотя-бы свойство ItemTemplate
 ///при необходимости инициализируем свойства EditItemTemplate и FooterTemplate
 ///объектами, реализующих ITemplate 
 tc.ItemTemplate=new MyTemplate();
 ///добавляем шаблонный столбец в коллекцию столбцов DataGrid
 dg.Columns.Add(tc);
 ///заполняем DataGrid данными
 dg.DataSource=GetGridData().DefaultView;
 dg.DataBind();
}
 /// <summary>
 /// Метод должен вернуть объект типа DataTable.
 /// Предполагается, что один из столбцов называется Name
 /// </summary>
 /// <returns></returns>
 private DataTable GetGridData()
 {
 ///код заполняющий DataTable (например из базы данных)
 ///необходимо, чтобы результат содержал
 ///столбец с именем Name, либо в tb_DataBinding(смотрите класс MyTemplate), в
 ///tb.Text=DataBinder.Eval(dgi.DataItem,"Name");
///вместо "Name", указать используемоя имя столбца
 ...
 }
 #region Web Form Designer generated code
 override protected void OnInit(EventArgs e)
 {
 //
 // CODEGEN: This call is required by the ASP.NET Web Form Designer.
 //
 InitializeComponent();
 base.OnInit(e);
 }
/// <summary>
 /// Required method for Designer support - do not modify
 /// the contents of this method with the code editor.
 /// </summary>
 private void InitializeComponent()
 { 
 this.Load += new System.EventHandler(this.Page_Load);
 }
 #endregion
}
public class MyTemplate:System.Web.UI.ITemplate
{
 public MyTemplate()
 {}
 #region ITemplate Members
 /// <summary>
 /// Реализация метода InstantiateIn интерфейса
 /// </summary>
 /// <param name="container">ячейка DataGrid в которую поместятся дочерние контралы</param>
 public void InstantiateIn(Control container)
 {
 ///создать можно любое количество любых контралов
 ///для примера созданы TextBox, Button и тег HTML <BR> для
 ///переноса кнопки на новую строку
 TextBox tb=new TextBox();
 tb.TextChanged+=new EventHandler(tb_TextChanged);
 tb.DataBinding+=new EventHandler(tb_DataBinding);
 container.Controls.Add(tb);
 LiteralControl lc=new LiteralControl("<br>");
 container.Controls.Add(lc);
 Button b=new Button();
 b.Text="Нажми меня";
 b.Click+=new EventHandler(b_Click);
 container.Controls.Add(b);
}
 #endregion
 /// <summary>
 /// Обработка события нажатия на кнопку
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void b_Click(object sender, EventArgs e)
 {
 //Ссылка на кнопку вызвавшую событие
 Button b=sender as Button;
 //получаем значение свойства Text, TextBox находящегося в одной 
 //ячейке с нашей кнопкой
 string st=(b.Parent.Controls[0] as TextBox).Text;
 }
 /// <summary>
 /// Метод будет вызван при связывании данных
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void tb_DataBinding(object sender, EventArgs e)
 {
 //получаем ссылку на TextBox вызвавший событие
 TextBox tb=sender as TextBox;
 //Находим DataGridItem в котором находится наш TextBox
 DataGridItem dgi=tb.NamingContainer as DataGridItem;
 //устанавливаем значение свойства Text
 tb.Text=DataBinder.Eval(dgi.DataItem,"Name");
 }
}
}


Автор Евгений Веприков
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#45
17.06.2004 23:14
Вопрос

WS. Как в веб-сервис передаются параметры по-ссылке?Насколько  я понимаю, в веб-сервис нельзя передать параметры  по ссылке. Почему тогда в ASP.NET можно создавать  методы  веб-сервисов с ref-параметрами?
Как-же они работают?

Ответ

Да, передавать параметры по ссылке в веб-сервис
невозможно. Дело в том, что при создании такого
метода ASP.NET генерирует WSDL-описание, в котором
метод имеет два параметра с одним именем - один
входной и один выходной.

Рассмотрим в качестве примера простой метод:

public string HelloWorld( ref int refParam );

При вызове метода клиент передаёт значение параметра:

<soap:Body>
 <HelloWorld xmlns="http://tempuri.org/">
 <refParam>int</refParam>
 </HelloWorld>
 </soap:Body>

а при возврате веб-сервис передаёт клиенту обратно "новое" значение - в виде выходного параметра:

<soap:Body>
 <HelloWorldResponse xmlns="http://tempuri.org/">
 <HelloWorldResult>string</HelloWorldResult>
 <refParam>int</refParam>
 </HelloWorldResponse>
 </soap:Body>

При генерации класса-посредника Visual Studio
создаёт метод с таким же ref-параметром и
обрабатывает его так, чтобы после вызова метода в
этот параметр записывалось возвращаемое значение.
Выглядит такой метод примерно так:


001 public string HelloWorld( ref int refParam )
002  {
003  object[] result = this.Invoke( "HelloWorld",
004  new object[] { refParam } );
005  
006  refParam = (int) result[1];
007  return (string) result[0];
008  }


В строке 006 как раз возвращённое из веб-сервиса
"новое" значение параметра записывается по ссылке,
переданной клиентом.

Таким образом, как для разработчика веб-сервиса
так и для клиента его вызывающего, возникает
полная иллюзия передачи параметра по ссылке.
Разумеется, при асинхронном вызове методов
веб-сервиса с этим будут проблемы, но это уже
"совсем другой вопрос."

Автор: Фёдор Сойкин a.k.a. Name
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#46
20.09.2004 8:53
Вопрос

Debug. Проблемы с отладкой ASP.NET приложений.Отладчик не запускается, не хватает прав и т.п.

Ответ

Решения некоторых проблем при отладке ASP.NET приложений.
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#47
29.10.2004 9:20
Вопрос

_VIEWSTATE. Что это, для чего и как с ним "бороться"?Состояние отображения (VIEWSTATE) в ASP.NET для чего нужно? Как уменьшить? Как отключить?

Ответ

"Понимание состояния отображения ASP.NET"статья.

"Как сохранить ViewState в объекте Session?", "Как сохраненить ViewState в произвольном хранилище?"презентация "тяжелая".

Обсуждение способов уменьшить размер VIEWSTATE.

Еще одно обсуждение по теме.
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#48
20.12.2004 18:15
Вопрос

События для обмена информацией между контролами, расположенными на странице.Предположим на странице есть два контрола. Как передать информацию из одного в другой.

Ответ

Предположим на странице есть два контрола, на одном содержится TextBox и Button, а на втором Label. Мы хотим внести текст в TextBox, нажать на Button и чтобы введенный текст отобразился в Label второго контрола. Контролы знать не знают друг о друге. Страница ничего не знает о внутреннем устройстве контролов. Для простоты будем использовать UserControl с кастомконтролами все аналогично.
Реализуем в первом контроле событие, а во втором обработчик этого события.
Итак класс, представляющий аргумент события.
/// <summary>
/// Класс представляет собой аргумент нашего события
/// </summary>
public class WebEventEventArgs:EventArgs
{
private string _caption = string.Empty;
/// <summary>
/// статическое поле имеющее тип данного класса и представляющее ссылку на пустое значение класса
/// </summary>
public static readonly WebEventEventArgs Empty;
/// <summary>
/// публичное свойство, предоставляющее доступ к передаваемой строке
/// </summary>
public string Caption
{
get
{
return _caption;
}
}
/// <summary>
/// конструктор
/// </summary>
/// <param name="caption">передаваемая обработчику строка</param>
public WebEventEventArgs(string caption)
{
_caption = caption;
}
/// <summary>
/// статический конструктор для свойства, означающего "пустой" класс
/// </summary>
static WebEventEventArgs()
{
WebEventEventArgs.Empty = new WebEventEventArgs(string.Empty);
}
}


Делегат реализующий вызов обработчика события.
/// <summary>
/// Объявляем делегат для нашего события
/// </summary>
public delegate void WebEventEventHandler(object sender, WebEventEventArgs e);


Класс первого UserControl содержащий событие.
public class TxbAndButton : System.Web.UI.UserControl
{
protected System.Web.UI.WebControls.TextBox txbText;
protected System.Web.UI.WebControls.Button Button1;
/// <summary>
/// данное поле является ключом в хештаблице, хранящей объект делегата, отвечающего за обработку нашего события
/// </summary>
private static readonly object WebEventKey = new object();
/// <summary>
/// Наше событие
/// </summary>
public event WebEventEventHandler LabelChanged 
{
add
{
Events.AddHandler(WebEventKey,value);
}
remove
{
Events.RemoveHandler(WebEventKey,value);
}
}
private void Page_Load(object sender, System.EventArgs e)
{

}
/// <summary>
/// Данный метод является возбудителем события
/// </summary>
/// <param name="e">Коммандный аргумент, передающий строку</param>
private void OnLabelChanged(WebEventEventArgs e)
{
///если кто-то подписался на данное событие, уведомить его
///Вообще-то возможно, что подписавщихся будет много и для обработки лучше воспользоваться
///таким кодом Delegate[] d = weeh.GetInvocationList();
///for (int i = 0; i < d.Length;i++)>
///{
///(d[i] as WebEventEventHandler)(this,e);
///}
///либо вообще асинхронным вызовом, но, в рамках ASP.NET, такое редко можно встретить
WebEventEventHandler weeh = (WebEventEventHandler)Events[WebEventKey];
if (weeh != null)
weeh(this,e);

}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
/// <summary>
/// Обработчик нажатия кнопки
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button1_Click(object sender, System.EventArgs e)
{
///создаем объект класса описывающего параметры события
WebEventEventArgs weea = new WebEventEventArgs(txbText.Text);
///возбуждаем событие
OnLabelChanged(weea);
}
}


Его.ascx.

<%@ Control Language="c#" AutoEventWireup="false" Codebehind="TxbAndButton.ascx.cs" Inherits="Orenburg.TxbAndButton" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%>
<P>
<asp:TextBox id="txbText" runat="server"></asp:TextBox></P>
<P>
<asp:Button id="Button1" runat="server" Text="Нажми меня"></asp:Button></P>


Класс второго контрола.
using System;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
public class OnlyLabel : System.Web.UI.UserControl
{
protected System.Web.UI.WebControls.Label Label1;
private void Page_Load(object sender, System.EventArgs e)
{

}
/// <summary>
/// Данный метод являеся обработчиком события первого UserControl
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void LabelChanged(object sender, WebEventEventArgs e)
{
Label1.Text = e.Caption;
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}



Его .ascx.

<%@ Control Language="c#" AutoEventWireup="false" Codebehind="OnlyLabel.ascx.cs" Inherits="Orenburg.OnlyLabel" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%>
<asp:Label id="Label1" runat="server"></asp:Label>


Переносим оба контрола на страницу. Немного изменяем Page_Load у страницы. Вот как должно получиться.
public class WebEvent : System.Web.UI.Page
{
private TxbAndButton TxbAndButton1;
private OnlyLabel OnlyLabel1;
private void Page_Load(object sender, System.EventArgs e)
{
///Находим контролы по их ID
TxbAndButton1 = FindControl("TxbAndButton1") as TxbAndButton;
OnlyLabel1 = FindControl("OnlyLabel1") as OnlyLabel;
///Если нашли, подписываем второй контрол на обработку события первого
if (OnlyLabel1 != null && TxbAndButton1 != null)
TxbAndButton1.LabelChanged += new WebEventEventHandler(OnlyLabel1.LabelChanged);
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{ 
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}


Компилируем и запускаем на выполнение. Как мы видим, при нажатии на кнопку в Label второго контрола, текст из TextBox первого.
Основываясь на данном примере, можно реализовывать алгоритмы для своих потребностей.

Автор Евгений Веприков.
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#49
09.02.2005 9:41
Вопрос

Как после отправки формы не дать перейти на нее по кнопке "Back"?Как правило это нужно для того, чтобы например не записать два и более раз одни и те же данные в базу данных.

Ответ

Как вариант можно предложить следующее решение.

  1. В Page_Load() генерируем GUID и сохраняем его в Session и ViewState.
  2. В Page_Load, до генерации GUID надо проверить, равны ли GUID сохраненные ранее, если равны, либо их вообще нет(первая загрузка страницы), то все нормально.
  3. Выполняем действия описанные в пункте первом и продолжаем нормальное исполнение кода страницы.
  4. Если же GUID в Session и ViewState не равны, то что то не так, обрабатываем ошибку в зависимости от конкретной ситуации.

P. S. Можно пользоваться не ViewState, а специально созданным Hidden полем.
Автор Евгений Веприков.

еще вариант:

Response.CacheControl = "no-cache";
Response.AddHeader("Pragma", "no-cache");
Response.Expires = -1;
Response.AddHeader("Cache-Control", "no-cache");


Автор Максим Козлов.
 
 
Chavo
Сообщений: 79 Регистрация: 20.02.2003
#50
06.04.2005 16:45
Вопрос

Как получить значения динамически добавляемых контролов.Я динамически добавляю на страницу контролы. Как мне получить введенные в них значения после PostBack?

Ответ

Что бы все срабатывало правильно, необходимо чтобы дерево контролов на странице до PostBack и сразу после было идентичным.

Как вариант могу предложить следующий способ.

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace Test.ForAnswer
{
/// <summary>
/// Форма показывает использование значений вводимых в динамически добавляемые контролы
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.PlaceHolder ph;
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.Button Button2;
protected System.Web.UI.WebControls.Label lblResult;
protected System.Web.UI.WebControls.Button Button3;
string CurControlKey = "CurControlKey";
public string CurrentControl
{
get
{
Object obj = ViewState[CurControlKey];
if (obj == null)
return "first";
return (string)obj;
}
set
{
ViewState[CurControlKey] = value;
}
}
Control GetFirstControl()
{
Table tab = new Table();
TableRow tr = new TableRow();
TableCell tc = new TableCell();
Label l = new Label();
l.Text = "Первый контрол";
tc.Controls.Add(l);
tr.Cells.Add(tc);
tc = new TableCell();
TextBox tb = new TextBox();
tb.ID = "firstTextBox";
tc.Controls.Add(tb);
tr.Cells.Add(tc);
tab.Rows.Add(tr);
return tab;
}
Control GetSecondControl()
{
Table tab = new Table();
TableRow tr = new TableRow();
TableCell tc = new TableCell();
Label l = new Label();
l.Text = "Второй контрол";
tc.Controls.Add(l);
tr.Cells.Add(tc);
tc = new TableCell();
CheckBox cb = new CheckBox();
cb.ID = "firstChekBox";
tc.Controls.Add(cb);
tr.Cells.Add(tc);
tab.Rows.Add(tr);
return tab;
}
private void Page_Load(object sender, System.EventArgs e)
{
InitPage();
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{ 
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Button2.Click += new System.EventHandler(this.Button2_Click);
this.Button3.Click += new System.EventHandler(this.Button3_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
/// <summary>
/// Восстанавливаем дерево контролов
/// </summary>
void InitPage()
{
ph.Controls.Clear();
switch(CurrentControl)
{
case "first":
ph.Controls.Add(GetFirstControl());
break;
case "second":
ph.Controls.Add(GetSecondControl());
break;
default:
throw new Exception("Не определен текущий контрол");
}
}
private void Button3_Click(object sender, System.EventArgs e)
{
switch(CurrentControl)
{
case "first":
lblResult.Text = (FindControl("firstTextBox") as TextBox).Text;
break;
case "second":
lblResult.Text = (FindControl("firstChekBox") as CheckBox).Checked.ToString();
break;
default:
throw new Exception("Не определен текущий контрол");
}
}
private void Button1_Click(object sender, System.EventArgs e)
{
Control c = GetFirstControl();
ph.Controls.Clear();
ph.Controls.Add(c);
CurrentControl = "first";
}
private void Button2_Click(object sender, System.EventArgs e)
{
Control c = GetSecondControl();
ph.Controls.Clear();
ph.Controls.Add(c);
CurrentControl = "second";
}
}
}

Данный метод также позволят обрабатывать события динамически добавляемых контролов.

Автор Евгений Веприков.
 
 
 
Страницы: Пред. 1 2 3 След.
Форумы GotDotNet.Ru » ASP.NET WebForms » FAQ по форуму ASP.NET
О сайте   Свяжитесь с нами   Конфиденциальность   Версия для печати
Работает на 1С-Битрикс: Управление сайтом ASP.NET  |  Хостинг на Parking.Ru