Устаревшая HTML-форма в приложении ASP .net - PullRequest
2 голосов
/ 26 марта 2009

У меня есть html-страница, которую я преобразую в asp .net-страницу. Эта страница содержала форму для доступа к внешнему веб-сайту, который я не могу контролировать. Ниже приведен пример кода:

<asp:Content ID="sample" ContentPlaceHolderID="body" Runat="Server">
<form name="Subscribe" method="post" action="http://anexternalwebsitehere.com/subscribe.asp">
        <input type="text" name="email" size="45" maxlength="120" />
        <input type="submit" name="submit" value="Subscribe" />
    </form>
</asp:Content>

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

Если я оставлю все как есть: Когда вы нажимаете на кнопку «Отправить», вы получаете постбэк на текущую страницу, а не на внешнюю страницу

Если просто преобразовать все в элементы управления asp и изменить URL-адрес обратной ссылки: Идентификаторы становятся неким извилистым "ctl00_body_ctl00", который внешняя страница не может интерпретировать.

Примечание: мне нужно, чтобы страница была страницей aspx, потому что я использую главную страницу для другого содержимого на странице.

Дополнительное примечание: это не Microsoft MVC.

Чего мне не хватает?

Ответы [ 4 ]

5 голосов
/ 26 марта 2009

Проблема была с вложенными формами, как уже упоминали другие.

Мне удалось исправить все мои проблемы, просто выполнив следующие действия:

  1. Удалить дополнительный элемент формы, который я добавлял.
  2. Оставьте все элементы управления как простые элементы управления html, кроме кнопки отправки.
  3. Замените кнопку отправки на кнопку asp .net и установите URL-адрес обратной передачи.

Старый код выглядит следующим образом:

<asp:Content ID="sample" ContentPlaceHolderID="body" Runat="Server">
<form name="Subscribe" method="post" action="http://anexternalwebsitehere.com/subscribe.asp">
        <input type="text" name="email" size="45" maxlength="120" />
        <input type="submit" name="submit" value="Subscribe" />
    </form>
</asp:Content>

Новый код:

<asp:Content ID="sample" ContentPlaceHolderID="body" Runat="Server">
        <input type="text" name="email" size="45" maxlength="120" />
        <input type="submit" name="submit" value="Subscribe" />
        <asp:button postbackurl="http://anexternalwebsitehere.com/subscribe.asp" text="Subscribe" runat="server" />
</asp:Content>

Это исправляет любые проблемы с недопустимыми вложенными формами, поскольку их нет. Это также решает проблему asp .net, переименовывающего элементы asp, потому что единственный переименованный элемент управления - это элемент управления asp, который не был необходим для успешной отправки.

2 голосов
/ 26 марта 2009

Поскольку у вас, вероятно, есть тег формы сервера на вашей главной странице, охватывающий ваш заполнитель контента, эта новая форма, которую вы объявляете, будет помещена внутри формы сервера (под формой сервера я имею в виду ту, которую asp.net использует для обратных передач с runat = "сервер")

У меня были случаи, когда мне требовалась специальная несерверная форма на странице aspx, которая уже имела серверную форму, и способ, которым я решил проблему, заключался в том, чтобы разместить эту несерверную форму вне серверной формы - что я имею в виду, поместите его после формы сервера. Поскольку вы используете мастер-страницы, вам понадобится новый заполнитель содержимого на этой мастер-странице, вы можете назвать его «noform». Он размещается после серверной формы, поэтому любой контент, помещенный в эту ноформу, будет размещен вне серверной формы. Это означает, что никакие элементы управления asp.net не будут работать в этом конкретном держателе содержимого (noform), так как они не будут приняты платформой, но вы сможете разместить там свою несерверную форму и поработать над этим.

1 голос
/ 26 марта 2009

Проблема, как вы, наверное, догадались, заключается в том, что у вас есть одна форма внутри другой формы - то есть устаревшая форма появляется внутри формы ASP.NET, требуемой для главной страницы.

Один быстрый (хотя и довольно неуклюжий) способ обойти это - закрыть форму ASP.NET над устаревшей формой, а затем открыть новую форму под устаревшей формой. Это означает, что у вас есть три формы на странице, ни одна из которых не является вложенной.

Итак, вы получите что-то вроде этого:

<asp:Content ID="sample" ContentPlaceHolderID="body" Runat="Server">
    </form>
    <form name="Subscribe" method="post" action="http://anexternalwebsitehere.com/subscribe.asp">
        <input type="text" name="email" size="45" maxlength="120" />
        <input type="submit" name="submit" value="Subscribe" />
    </form>
    <form method="post" action="myAspNetPage.aspx">
</asp:Content>

Закрывающий тег </form> в начале закрывает ASP.NET с главной страницы. Затем у вас есть форма, которая теперь должна работать, как ожидалось. Тогда открытый тег <form> в конце просто гарантирует, что закрывающий тег </form> на главной странице является действительным HTML.

Очевидно, что все, что появляется на главной странице после устаревшей формы, не будет входить в стандартную форму ASP.NET, поэтому это может не сработать для вас в зависимости от структуры остальной части вашей страницы.

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

В нашем случае мы не могли изменить унаследованную форму, так как она была предоставлена ​​сторонней организацией, регулярно менялась и должна была быть перенесена на страницу ASP.NET без участия разработчика для ее изменения (например, как в отличие от решения Брайана своего собственного вопроса, который требует редактирования формы и, безусловно, является лучшим вариантом в его случае - и, вероятно, в большинстве других случаев, когда существует аналогичная проблема).

0 голосов
/ 26 марта 2009

Событие нажатия вашей кнопки будет обрабатывать отправку URL и данных.

//C# source
protected void button_Click(object sender, EventArgs e)
}
  string customURL = "http://anexternalwebsitehere.com/";
  string emailValue = textBoxEmail.Text; //of course validate this for proper email...

  customURL += "page.aspx?email=" + emailValue;

  Response.Redirect(customURL);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...