Member 12952690 Ответов: 3

Как передать текстовое поле ввода со страницы ASPX в код, находящийся за ней в ASPX.VB


Я уже несколько дней ищу, как это сделать. Вот моя установка. У меня есть веб-страница ASPX с некоторыми полями ввода. Кнопка Отправить предназначена для добавления данных из форм в таблицу SQL. У меня возникли проблемы с синтаксисом, который я вставил в инструкцию SQL, которая будет работать.

Это работает до тех пор, пока я помещаю контент только в текст вставки SQL. Но когда я пытаюсь изменить это на поле ввода, то именно там у меня возникают проблемы.

Imports System.Data
Imports System.Data.SqlClient

Partial Class Agent_Add
    Inherits System.Web.UI.Page
    Dim cn As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\inetpub\wwwroot\RedRock\App_Data\Database.mdf;Integrated Security=True")
    Dim cm As New SqlCommand

    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
        cn.Open()
        cm.Connection = cn
        cm.CommandText = "insert into tblAgents (UserName,LoginID,eMailAddress,Phone) Values ('test'," ,'bsmart','smart@yahoo.net,'304-666-7777')"
        cm.ExecuteNonQuery()
        Response.Write("Recored Added")
        cn.Close()
    End Sub
End Class


Что я уже пробовал:

Вот некоторые методы, которые я пробовал.

1. cm. CommandText = " вставить в tblAgents (UserName) значения (AgentsName. text)"
2, cm. CommendText = " вставить в tblAgents (UserName) значения ("'& AgentsName &'")"
3. cm. CommandText = " вставить в tblAgents (UserName) значения (@AgentsName)"

Я перепробовал несколько комбинаций и, похоже, не могу найти ни одной, которая работает.

3 Ответов

Рейтинг:
2

Richard Deeming

Попробовать это:

Imports System.Data
Imports System.Data.SqlClient

Partial Class Agent_Add
    Inherits System.Web.UI.Page

    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
        Const query As String = "insert into tblAgents (UserName, LoginID, eMailAddress, Phone) Values (@UserName, @LoginID, @eMailAddress, @Phone)"
        
        Using cn As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True")
            Using cm As New SqlCommand(query, cn)
                cm.Parameters.AddWithValue("@UserName", AgentsName.Text)
                cm.Parameters.AddWithValue("@LoginID", LoginID.Text)
                cm.Parameters.AddWithValue("@eMailAddress", EmailAddress.Text)
                cm.Parameters.AddWithValue("@Phone", Phone.Text)
                
                cn.Open()
                cm.ExecuteNonQuery()
            End Using
        End Using

        Response.Write("Recored Added")
    End Sub
End Class

  • Никогда не используйте конкатенацию строк для построения SQL-запроса, иначе вы оставите свой код уязвимым для SQL-инъекция[^].
  • Не храните объекты соединения / команды в качестве полей в вашем классе. Вместо этого создайте их как локальные переменные, когда это необходимо.
  • Оберните объекты, которые реализуют IDisposable в Using блоки.
  • Воспользуйся |Параметр datadirectory|[^] в строке подключения для ссылки на App_Data папка.
  • В идеале вы должны храните строку подключения в своем web.config файл[^].


Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]


Member 12952690

Спасибо вам за быстрый ответ и помощь, а также за отличные предложения. У меня все еще есть проблемы с именем агента.Текстовое поле из формы. Visual Studio и ошибка, которую я получаю, заключается в том, что имя агента не объявлено. Как мне это объявить? Я подтвердил, что синтаксис написан правильно из формы.

Richard Deeming

Эта ошибка означает, что у вас нет элемента управления на Вашей странице с ID="AgentsName" Либо имя задано на что-то другое, либо элемент управления находится внутри шаблона элемента управления с привязкой к данным.

Member 12952690

Кроме того, если у вас есть какие-либо рекомендации по хорошим справочникам по ASP.NET и VB.NET использование с SQL это было бы очень хорошо. Я хочу быть в состоянии полностью понять, что я кодирую.

Richard Deeming

То ASP.NET сайт[^]- это хорошее место для начала.

Есть также некоторые предложения в эта нить в гостиной[^].

ZurdoDev

+5. Приятно.

Richard Deeming

Для того чтобы получить доступ к элементу управления из кода, он должен иметь runat="server" добавлен:

<input id="txtAgentsName" runat="server" ... />


И так как вы используете <input> вместо того, чтобы <asp:TextBox>, вы будете нуждаться, чтобы использовать Value собственность, а не Text собственность:
cm.Parameters.AddWithValue("@UserName", txtAgentsName.Value)

Рейтинг:
12

Member 12952690

Не решение, но не смог пройти мимо HTML в комментарии выше.

Отличный улов. У меня было определено поле, но не установлен идентификатор. Я сделал это сейчас, но все еще имею ту же ошибку. Вот мой код для формы ASPX. Как видите, это простая форма с единственной таблицей для полей. Я добавил txtFieldName перед каждым полем. Затем сделал те же изменения в aspxvb run behind. Это показано ниже формы.

Агент-Добавить.aspx-форму :

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Agent-Add.aspx.vb" Inherits="Agent_Add" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Red Rock Reservation System</title>
    <link rel="stylesheet" type="text/css" href="css\appstyle.css">
</head>

 <form id="form1" runat="server">

 <Center>

    <img src="graphics\redrock-logo.png" alt="Red Rock Travel" style=" width:150px;height:150px";><br>
    Reservation System Agent Add Module (ver1.0)

<br />
<br />
     
   <!--- <form method="post" action="Agent-Post.aspx" autocomplete="off"> --->

<table border="1">
    <tr>
        <td>Agents Name:</td>
        <td><input type="text" name="AgentsName" maxlength="20" autocomplete="off" id="txtAgentsName" formenctype="text/plain" required="required" /></td>
    </tr>

    <tr>
        <td>Agent Login ID:</td>
        <td id="txtLoginID"><input type="text" name="LoginID" maxlength="20" id="AgentLoginID" /></td>
    </tr>

    <tr>
        <td>Agent Password:</td>
        <td><input type="text" name="Password" maxlength="50" id="txtPassword" /></td>
    </tr>

    <tr>
        <td>Agents Access Level (1-5):</td>
        <td><input type="text" name="AgentLevel" id="txtAccessLevel" /></td> 
    </tr>

    <tr>
        <td>Email Address:</td>
        <td><input type="text" name="eMailAddress" id="txtEmailAddress" /></td> 
    </tr>

    <tr>
        <td>Phone:</td>
        <td><input type="text" name="Phone" id="txtPhone" /></td> 
    </tr>

   <!-- <tr>
        <td colspan="2" align="center">
        <br />
        <input type="submit" value="Add Agent" />
        <input type="reset" value="Clear Form" />
        <br />
        <br />
            <br />
        </td>
    </tr> -->
    
</table>
    
     <br />
    
  <!--- </form> --->

        <asp:Button ID="btnAdd" runat="server" Text="Add" Width="89px" />

        </Center>
</body>
</form>

</html>



Код позади: агент-Add. aspx.vb

Imports System.Data
Imports System.Data.SqlClient

Partial Class Agent_Add
    Inherits System.Web.UI.Page

    Protected Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
        Const query As String = "insert into tblAgents (UserName, LoginID, eMailAddress, Phone) Values (@UserName, @LoginID, @eMailAddress, @Phone)"

        Using cn As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True")
            Using cm As New SqlCommand(query, cn)
                cm.Parameters.AddWithValue("@UserName", txtAgentsName.text)
                cm.Parameters.AddWithValue("@LoginID", txtLoginID.Text)
                cm.Parameters.AddWithValue("@eMailAddress", txtEmailAddress.Text)
                cm.Parameters.AddWithValue("@Phone", txtPhone.Text)

                cn.Open()
                cm.ExecuteNonQuery()
            End Using
        End Using

        Response.Write("Recored Added")
    End Sub
End Class


Рейтинг:
1

Member 12952690

Решено!!! ДА.

Сначала на странице ASPX вы должны установить ID= для каждого поля. Во-вторых, у вас есть текст поля или значение, установленное для запуска на сервере.

cm.Parameters.AddWithValue("@UserName", Request.Form("AgentsName"))


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

Итак, вот фрагмент кода aps: TextBox.

asp:TextBox type="text" name="AgentsName" maxlength="20" id="AgentsName" runat="server" />


Теперь на странице code behind показано, как вы получаете доступ к данным, передаваемым со страницы ASPX на страницу ASPX.VB.


cm.Parameters.AddWithValue("@UserName", Request.Form("AgentsName"))


Таким образом, вы сохраняете его с идентификатором="имя поля" и извлекаете его с помощью запроса.Форма ("Имя Поля")

Что удивительно, так это то, как трудно было это найти. 2 недели на это. Надеюсь, это поможет кому-то еще.