Для отправки данных на сервер нередко используются формы html. В этом случае обычно для отправки данных используются запросы типа POST. Для получения подобных данных в ASP.NET Core в классе HttpRequest определено свойство Form. Рассмотрим, как мы можем получить подобные данные.
Прежде всего определим в проекте в папке html файл index.html
Определим в нем следующее содержимое:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>METANIT.COM</title>
</head>
<body>
<h2>User form</h2>
<form method="post" action="postuser">
<p>Name: <input name="name" /></p>
<p>Age: <input name="age" type="number" /></p>
<input type="submit" value="Send" />
</form>
</body>
</html>
Здесь определена форма условно для ввода данных пользователя, которая в запросе типа POST (атрибут method="post") отправляет данные по адресу "postuser"
(атрибут action="postuser")
На форме определены два поля ввода. Первое поле предназначено для ввода имени пользователя. Второе поле - для ввода возроста пользователя.
Для получения этих данных определим в файле Program.vb следующий код:
Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http
Module Program
Sub Main(args As String())
Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()
app.Run(Async Function(context As HttpContext) As Task
context.Response.ContentType = "text/html; charset=utf-8"
' если обращение идет по адресу "/postuser", получаем данные формы
If context.Request.Path.Value = "/postuser" Then
Dim form = context.Request.Form
Dim name = form("name")
Dim age = form("age")
Await context.Response.WriteAsync($"<div><p>Name: {name}</p><p>Age: {age}</p></div>")
Else
Await context.Response.SendFileAsync("html/index.html")
End If
End Function)
app.Run()
End Sub
End Module
Здесь, если запрошен адрес "/postuser", то предполагается, что отправлена некоторая форма. Сначала получаем отправленную форму в переменную form:
Dim form = context.Request.Form
Свойство Request.Form возвращает объект IFormCollection - своего рода словарь, где по ключу можно получить значение элемента.
При этом в качестве ключей выступает названия полей форм (значения атрибутов name элементов формы):
<input name="age" type="number" />
Так, в данном случае название поля (значение атрибута name) равно "age". Соответственно в Request.Form по этому имени мы можем получить его значение:
Dim age = form("age")
После получения данных формы они отправляются обратно клиенту:
Усложним задачу и добавим в форму на странице index.html несколько полей, которые будут представлять массив:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>METANIT.COM</title>
</head>
<body>
<h2>User form</h2>
<form method="post" action="postuser">
<p>Name: <br />
<input name="name" />
</p>
<p>Age: <br />
<input name="age" type="number" />
</p>
<p>
Languages:<br />
<input name="languages" /><br />
<input name="languages" /><br />
<input name="languages" /><br />
</p>
<input type="submit" value="Send" />
</form>
</body>
</html>
Здесь добавлено три поля ввода, которые имеют одно и то же имя. Поэтому при их отправке будет формироваться массив из трех значений. Теперь получим эти значения в коде Visual Basic .NET:
Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http
Module Program
Sub Main(args As String())
Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()
app.Run(Async Function(context As HttpContext) As Task
context.Response.ContentType = "text/html; charset=utf-8"
' если обращение идет по адресу "/postuser", получаем данные формы
If context.Request.Path.Value = "/postuser" Then
Dim form = context.Request.Form
Dim name = form("name")
Dim age = form("age")
Dim languages As String() = form("languages")
'создаем из массива languages одну строку
Dim langList = String.Empty
For Each lang In languages
langList += $" {lang}"
Next
Await context.Response.WriteAsync($"<div><p>Name: {name}</p>" +
$"<p>Age: {age}</p>" +
$"<div>Languages:{langList}</ul></div>")
Else
Await context.Response.SendFileAsync("html/index.html")
End If
End Function)
app.Run()
End Sub
End Module
Поскольку параметр "languages" представляет массив, то и сопоствляться он будет с массивом строк:
Dim languages As String() = form("languages")
Для вывода на веб-страницу из этого массива формируется код html в виде строки:
Подобным образом можно передавать значения массива полей других типов, либо полей, которые представляют набор элементов, например, элемента select, который поддерживает множественный выбор:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>METANIT.COM</title>
</head>
<body>
<h2>User form</h2>
<form method="post" action="postuser">
<p>Name: <br />
<input name="name" />
</p>
<p>Age: <br />
<input name="age" type="number" />
</p>
<p>
Languages:<br />
<select multiple name="languages">
<option>C#</option>
<option>VB.NET</option>
<option>Kotlin</option>
<option>Java</option>
</select>
</p>
<input type="submit" value="Send" />
</form>
</body>
</html>