【发布时间】:2019-12-26 21:31:39
【问题描述】:
我正在创建一个向用户展示表单的应用程序。当用户提交表单时,我的应用程序会获取这些值并将它们格式化为查询字符串。然后使用此字符串调用第三方 API。该应用程序是使用 Visual Studio 2019 中的 ASP.NET Core Razor Pages 模板用 C# 编写的。我首先尝试在控制台应用程序中创建一个 HTTPClient 并使用硬编码值将 HTTPRequestMessage 发送到第三方 API,效果很好.但是,当将我的代码移动到 Razor Pages 应用程序以添加应用程序的前端时,我似乎无法让应用程序调用我创建的代码。由于我只获取表单值并将它们以查询字符串的形式传递给第三方 API,这不需要我定义自己的模型,因此我决定使用 Razor Pages 而不是 ASP.NET MVC。
这是我在应用程序中设置的 Index.cshtml 页面:
@page
@model IndexModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{
ViewData["Title"] = "Home page";
}
<div>
<form asp-page-handler="ProcessRequest" method="post">
<label for="FirstName">First Name:</label>
<input type="text" name="FirstName" value="" />
<label for="LastName">Last Name:</label>
<input type="text" name="LastName" value="" />
<label for="Email">Email:</label>
<input type="text" name="Email" value="" />
<button type="submit">Send Request</button>
</form>
</div>
如您所见,它只是一个具有三个输入字段的简单表单,没有什么花哨的。
包含模型逻辑的底层 Index.cshtml.cs 文件具有以下代码:
public class IndexModel : PageModel
{
static HttpClient myAppHTTPClient = new HttpClient();
public async void OnPostProcessRequestAsync()
{
string firstName, lastName, email;
string host = "https://thirdparty.app.com:443/";
string pathname = "path/to/api/endpoint/?operation=create";
firstName = "Test";
LastName = "User";
email = "TestUser@email.com";
string path = pathname + "&first_name=" + firstName + "&last_name=" + lastName + "&email=" + email;
string requestUrl = host + path;
HttpRequestMessage httpRequestMessage = new HttpRequestMessage();
try
{
HttpResponseMessage responseMessage = await myAppHTTPClient.PostAsync(requestUrl, httpRequestMessage.Content);
HttpContent content = responseMessage.Content;
string message = await content.ReadAsStringAsync();
Console.WriteLine("The output from thirdparty is: {0}", message);
RedirectToPage();
}
catch (HttpRequestException exception)
{
Console.WriteLine("An HTTP request exception occurred. {0}", exception.Message);
}
}
}
ASP.NET Razor Pages 的文档说,当您的表单中有一个 asp-page-handler 标签助手时,提交表单将调用页面处理程序方法OnPost[method_name]Async()。在我的例子中,表格中的<form asp-page-handler="ProcessRequest" method="post"> 行应该调用public async void OnPostProcessRequestAsync() 方法。但是,这并没有像我想象的那样工作。我尝试在表单和提交按钮中使用不同的标签助手。有没有办法让 Razor Page 调用运行我的代码的方法。我知道我缺少 RedirectToPage() 方法,但我首先想让方法调用工作。
【问题讨论】:
-
我不熟悉 Razor 页面,但是异步方法应该返回一个 Task/Task
,只有在异步事件处理程序的情况下才应该返回 void。 -
是的,我不太清楚 Razor 页面应用程序与 MVC 应用程序有何不同。既然您提到了它,我确实注意到文档示例中的 OnPostAsync() 方法如何返回 Task
。不确定 Task 是什么或我应该如何返回它。有什么想法吗? -
不工作是什么意思?单击提交按钮时该函数未触发?
-
是的,这就是我所说的不工作的意思。
-
在
RedirectToPage()之前添加return语句并将处理程序更改为返回Task<IActionResult>,而不是void。您还需要return来自catch块。而Console.WriteLine在 ASP.NET 应用程序中毫无意义。
标签: c# http asp.net-core razor-pages