我一直在嘗試學習 Blazor WebAssembly 編程,并且一直在做一個后續專案以及我正在學習的 Pluralsight 課程。
發生的情況是以下代碼中的 PutAsync() 方法失敗:
public async Task UpdateEmployee(Employee employee)
{
try
{
var jsonString = JsonSerializer.Serialize(employee).ToString();
var employeeJson =
new StringContent(JsonSerializer.Serialize(employee), Encoding.UTF8, "application/json");
await _httpClient.PutAsync($"/api/employee", employeeJson);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
此代碼位于服務類中,具有 HttpPut 屬性的目標方法似乎沒有被呼叫,或者我放置在其中的斷點永遠不會被命中。
[HttpPut]
public IActionResult UpdateEmployee([FromBody] Employee employee)
{
if (employee == null)
return BadRequest();
if (employee.FirstName == string.Empty || employee.LastName == string.Empty)
{
ModelState.AddModelError("Name/FirstName", "The name or first name shouldn't be empty");
}
if (!ModelState.IsValid)
return BadRequest(ModelState);
var employeeToUpdate = _employeeRepository.GetEmployeeById(employee.EmployeeId);
if (employeeToUpdate == null)
return NotFound();
_employeeRepository.UpdateEmployee(employee);
return NoContent(); //success
}
我把斷點放在了if (employee == null)
線上,但它沒有被擊中。最初我遇到了很多斷點未命中的問題,但自從我從 Firefox 切換到 Chrome 進行測驗后,情況好多了。然而,執行似乎并沒有到這里。此目標類頂部的路由屬性如下所示:
[Route("api/[controller]")]
[ApiController]
該類本身被稱為EmployeeController
,所以我認為該"api/employee"
屬性應該到達它。
我在我發布的第一個代碼塊中的失敗代碼周圍添加了一個 try/catch 塊,當我單步執行時,我看到在我嘗試跨過 PutAsync() 方法后拋出了一個例外。但是當我去命令視窗查看 ex.Message 的內容是什么時,我在 Visual Studio 中得到“無法評估”錯誤。
如果我單步執行,我會看到執行命中了顯示編輯表單的 Razor 檔案中的一些系結欄位,但我對 Razor 的了解還不夠,無法真正推斷出正在發生的事情。那里有許多欄位如下所示:
<div >
<label for="lastName" >Last name: </label>
<InputText id="lastName" @bind-Value="@Employee.LastName" placeholder="Enter last name"></InputText>
</div>
<div >
<label for="firstName" >First name: </label>
<InputText id="firstName" @bind-Value="@Employee.FirstName" placeholder="Enter first name"></InputText>
</div>
<div >
<label for="birthdate" >Birthdate: </label>
<InputDate id="birthdate" @bind-Value="@Employee.BirthDate" placeholder="Enter birthdate"></InputDate>
</div>
<div >
<label for="email" >Email: </label>
<InputText id="email" @bind-Value="@Employee.Email" placeholder="Enter email"></InputText>
</div>
然后,在某個時刻,在單步執行時,很多欄位都被跳過,執行似乎突然離開了 Razor 檔案。我不知道該怎么做,而且由于過去幾年我基本上沒有出現在 .Net 中,這一切確實讓人感覺有點不知所措。我不太確定 PutAsync() 方法呼叫失敗如何真正轉化為這些可能的資料系結錯誤,但我猜測 PutAsync() 只是呼叫任何具有 [HttpPut] 屬性的代碼的工具,并且任何型別的此方法呼叫之后任何地方的例外都會導致 PutAsync() 呼叫失敗。這是否準確?
uj5u.com熱心網友回復:
嘗試等待“api/employee”
var employeeToUpdate = await _employeeRepository.GetEmployeeById(employee.EmployeeId);
uj5u.com熱心網友回復:
EditForm
不要使用沒有andmodel
or的內置表單組件EditContext
。- 在提交之前使用
DataAnnotationsValidator
和/或組件來驗證您的表單。ValidationSummary
OnValidSubmit
僅當具有驗證控制元件時才使用方法提交表單。- 如果您不想使用
OnValidSubmit
,請在請求之前檢查您的EditContext
驗證PutAsync()
。 - 請查看Microsoft 檔案以獲取更多資訊,我相信這比您所遵循的課程更清楚。
uj5u.com熱心網友回復:
非常感謝大家提供的所有有用建議,尤其是瀏覽器開發工具控制臺提示。
因此,我將System.Diagnostics.Debug.WriteLine(ex.Message)
行更改為Console(ex.Message)
,我在瀏覽器開發工具控制臺中看到的錯誤是:
Access to fetch at 'https://localhost:44340/api/employee' from origin 'https://localhost:44362' has been blocked by CORS policy: Method PUT is not allowed by Access-Control-Allow-Methods in preflight response.
我去ConfigureServices()
了web服務的startup.cs檔案中的方法,我把代碼從
services.AddCors(options =>
{
options.AddPolicy("Open", builder => builder.AllowAnyOrigin().AllowAnyHeader());
});
至
services.AddCors(options =>
{
options.AddPolicy("Open", builder => builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod());
});
錯誤消失了,員工記錄現在已正確保存。我確實意識到,呼叫類似的東西并不完全是一種合理的編程實踐AllowAnyMethod()
,但就本課程而言,現在就足夠了。再次感謝大家!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/495273.html
標籤:http 数据绑定 西装外套 网络组装 视觉工作室调试