Как разместить форму с HTML на страницу ASPX - PullRequest
24 голосов
/ 16 октября 2008

Как разместить форму со страницы HTML на странице ASPX (2.0) и иметь возможность читать значения?

В настоящее время у меня есть сайт ASP.NET с использованием поставщика членства, и все работает нормально. Пользователи могут войти со страницы Login.aspx.

Теперь мы хотим, чтобы пользователи могли входить напрямую с другого веб-сайта, который в основном представляет собой статическую HTML-страницу. Пользователи должны иметь возможность ввести свое имя и пароль на этой HTML-странице и отправить их POST на мою страницу Login.aspx (где я могу затем войти в систему вручную).

Можно ли передать значения формы из HTML в ASPX? Я перепробовал все, и коллекция Request.Form.Keys всегда пуста. Я не могу использовать HTTP GET, так как это учетные данные и их нельзя передать в строке запроса.

Единственный способ, которым я знаю, - это iframe.

Ответы [ 8 ]

28 голосов
/ 16 октября 2008

Это очень возможно. Я макетировал 3 страницы, которые должны дать вам подтверждение концепции:

.aspx page:

<form id="form1" runat="server">
    <div>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:TextBox TextMode="password" ID="TextBox2" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" Text="Button" />
    </div>
</form>

код позади:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    For Each s As String In Request.Form.AllKeys
        Response.Write(s & ": " & Request.Form(s) & "<br />")
    Next
End Sub

Отдельная страница HTML:

<form action="http://localhost/MyTestApp/Default.aspx" method="post">
    <input name="TextBox1" type="text" value="" id="TextBox1" />
    <input name="TextBox2" type="password" id="TextBox2" />
    <input type="submit" name="Button1" value="Button" id="Button1" />
</form>

... и он извергает значения формы, как и ожидалось. Если это не работает, как предлагали другие, используйте инструмент анализа трафика (fiddler, ethereal), потому что, вероятно, что-то идет не так, как вы ожидаете.

19 голосов
/ 28 октября 2008

Коллекция Request.Form.Keys будет пустой, если ни один из ваших html-входов не имеет ИМЯ. Легко забыть положить их туда после того, как вы уже некоторое время занимаетесь .NET. Просто назовите их, и вам будет хорошо.

2 голосов
/ 16 октября 2008

Вы уверены, что ваша HTML-форма верна и действительно выполняет HTTP POST? Я бы предложил запустить Fiddler2 , а затем попытаться войти через свой Login.aspx, затем на удаленный HTML-сайт, а затем сравнить запросы, отправленные на сервер. Для меня ASP.Net всегда работал нормально - если HTTP-запрос содержит действительный POST, я могу получить значения, используя Request.Form ...

1 голос
/ 21 марта 2014

В html-форме вам необходимо указать дополнительную переменную viewstate и отключить ViewState на странице сервера. Это требует некоторого контроля с обеих сторон.

Форма HTML:

<html><body> <form id='postForm' action='WebForm.aspx' method='POST'>
        <input type='text' name='postData' value='base-64-encoded-value' />
        <input type='hidden' name='__VIEWSTATE' value='' />  <!-- still need __VIEWSTATE, even empty one -->
    </form>

</body></html>

Примечание пусто __VIEWSTATE.

WebForm.aspx:

<%@ Page Language="C#" AutoEventWireup="true" 
CodeBehind="WebForm.aspx.cs" Inherits="WebForm"
 EnableEventValidation="False" EnableViewState="false" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="postForm" runat="server">
        <asp:TextBox ID="postData" runat="server"></asp:TextBox>
    <div>

    </div>
    </form>
</body>
</html>

Примечание EnableEventValidation="False", EnableViewState="false" для предотвращения ошибки проверки для пустого состояния просмотра. Код за / наследует значения не являются точными.

WebForm.cs:

public partial class WebForm : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string value = Encoding.Unicode.GetString(Convert.FromBase64String(this.postData.Text));
    }
}
1 голос
/ 16 октября 2008

Ты уверен, что можешь. Создайте HTML-страницу с формой, которая будет содержать необходимые компоненты со страницы login.aspx (т.е. имя пользователя и т. Д.), И убедитесь, что они имеют одинаковые идентификаторы. Для вашего действия, убедитесь, что это пост.

Возможно, вам придется сделать некоторый код на странице login.aspx в функции Page_Load, чтобы прочитать форму (в объекте Request.Form) и вызвать соответствующие функции для входа пользователя, но кроме этого вам следует иметь доступ к форме и делать с ней все, что вы хотите.

1 голос
/ 16 октября 2008

Вы уверены, что можете.

Самый простой способ узнать, как это можно сделать, - перейти на страницу aspx, на которую вы хотите опубликовать. Затем сохраните источник этой страницы как HTML. Измените действие формы на новой html-странице, чтобы она указала на страницу aspx, с которой вы изначально скопировали ее.

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

0 голосов
/ 29 ноября 2018

Удалить runat = "серверные" части публикации данных / опубликованную страницу .aspx.

0 голосов
/ 23 марта 2014

Надеюсь, это поможет - Поместите этот тег в HTML и

удалите ваш дизайн login.aspx .. просто напишите директиву только для страницы

и вы получите значения на странице aspx после нажатия кнопки подтверждения. как это- защищенная пустота Page_Load (отправитель объекта, EventArgs e) {

        if (!IsPostBack)
        {
            CompleteRegistration();
        }
    }

public void CompleteRegistration () {

        NameValueCollection nv = Request.Form;
        if (nv.Count != 0)
        {
            string strname = nv["txtbox1"];
            string strPwd = nv["txtbox2"];
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...