ASP.NET: как перенаправить, предварительно заполнив данные формы? - PullRequest
2 голосов
/ 27 июня 2009

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

Я попытался установить свой текущий Request.Form data:

if (theyWantToDoSomething)
{
   //pre-fill form values
   context.Request.Form["TextBox1"] = "test";
   context.Request.Form["ComboBox1"] = "test 2";
   context.Request.Form["TextBox2"] = GetTheTextForTheThing();

   //tell the client to go there
   context.Response.Redirect("~/SomeWebForm.aspx");
   return;        
}

Но я получаю исключение, что Форма значения доступны только для чтения.

Каким будет способ отправки клиента на другую страницу, предварительно заполнив данные формы?


Ответ

Я использовал состояние сеанса для хранения значений. Важно отметить, что по умолчанию обработчик не имеет доступа к Session (объект Session будет null ). Вы должны указать IIS предоставить вам объект Session , добавив интерфейс маркера IRequiresSessionState в ваш класс обработчика:

public class Handler : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{
   public void ProcessRequest(HttpContext context)
   {
      ...
      if (theyWantToDoSomething)
      {
         //pre-fill form values
         context.Session["thing1"] = "test";
         context.Session["thing2"] = "test 2";
         context.Session["thing3"] = GetTheTextForTheThing();

         //tell the client to go there
         context.Response.Redirect("~/SomeWebForm.aspx");
         return; //not strictly needed, since Redirect ends processing
      }
      ...
   }
}

Ответы [ 3 ]

7 голосов
/ 27 июня 2009

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

Если вы используете ASP.NET, существует множество способов выполнить то, что вам нужно:

  • Лучшим способом, вероятно, будет передача данных, которые необходимо предварительно заполнить, в SomeWebForm.aspx через объект Session, и на этих страницах метод Load заполните свою форму. Помните, что при выполнении Response.Redirect клиенту отправляется ответ 302 с URL-адресом, на который клиент должен перенаправить сообщение. Процесс прозрачен для пользователя ... но здесь задействовано полное круговое путешествие.

  • Другая альтернатива заполнению пользовательской сессии - добавление параметров GET через строку запроса для перенаправления на SomeWebForm.aspx.

  • Если вам нужно перенести обработку на страницу SomeWebForm.aspx без циклического отключения, вы можете использовать Server.Transfer. Это перенесет выполнение с текущей страницы на выбранную вами страницу ... однако, это может вызвать некоторое странное поведение на стороне клиента, поскольку URL-адрес не обновляется. Что касается пользователя, он все равно будет выглядеть так, как будто он находится на той же странице, на которой он начал.

3 голосов
/ 27 июня 2009

Несколько идей, с которых можно начать:

  1. Передать значения в строке запроса
  2. Сохранить значения в состоянии сеанса или в отдельном файле cookie
  3. Сохраните значения в HttpContext.Items и используйте Server.Transfer вместо Response.Redirect
1 голос
/ 29 июня 2009

Другим подходом, который еще не был упомянут, является использование Server.Transfer, позволяющее использовать свойство Page.PreviousPage , позволяющее получить доступ к элементам управления на странице, которая передала элемент управления.

Как упоминалось в jrista, использование Transfer не обновляет отображаемый пользователю URL, что может быть или не быть проблемой. Например, пользователь не может точно добавить в закладки страницу, на которую он был перенесен, так как URL будет таким же, как и у исходной страницы для передачи.

...