【发布时间】:2022-01-26 01:45:06
【问题描述】:
我正在尝试使用我的 web api 中的 Post 方法创建一个复杂的对象。但是,我很难做到这一点,因为当我创建一个 Board 对象时,我要求它有一个 Board.Company.Name 将它与公司相关联。但是,当我选择一个已经存在的公司名称并处理有效提交时,会使用我选择的 Board.Company.Name 创建一个新公司。然后我显示我创建的董事会,看起来没有公司实际上与它相关联。下面我已经包含了相关代码。这是我第一个使用 C# 和 Blazor 的项目,所以如果我遗漏了任何重要的内容,请告诉我,我会包括在内。
公司模式
public class Company
{
[Key]
public Guid Id { get; set; }
[Required]
public string Name { get; set; }
public DateTime Founded { get; set; }
}
板型
public class Board
{
[Key]
public Guid Id { get; set; }
[ValidateComplexType]
public Company Company { get; set; } = new();
[Required]
public string Name { get; set; }
public string Description { get; set; }
public List<Ticket> Tickets { get; set; }
public Board()
{
}
}
API POST 方法
[HttpPost]
public async Task<ActionResult<Board>> PostBoard(Board board)
{
_context.Boards.Add(board);
await _context.SaveChangesAsync();
return CreatedAtAction("GetBoard", new { id = board.Id }, board);
}
创建_Board
@page "/create_board"
@inject NavigationManager Navigation
@inject HttpClient Http
<div>
<button class="btn btn-outline-secondary oi oi-arrow-left" @onclick="GoToHome"></button>
<h3 class="text-center">Create a board</h3>
</div>
<hr />
<EditForm Model="Board" OnValidSubmit="@HandleValidSubmit">
<ObjectGraphDataAnnotationsValidator />
<div class="form-group row">
<label for="Company" class="col-sm-2 col-form-label">Company</label>
<div class="col-sm-10">
<InputSelect id="Company" class="form-control" @bind-Value="Board.Company.Name">
<option value="" disabled selected>Company</option>
@foreach (var company in Companies)
{
<option>@company.Value.Name</option>
}
</InputSelect>
<ValidationMessage For="@(() => Board.Company.Name)" />
</div>
</div>
<div class="form-group row">
<label for="Name" class="col-sm-2 col-form-label">Name</label>
<div class="col-sm-10">
<InputText id="Name" class="form-control" placeholder="Name" @bind-Value="Board.Name" />
<ValidationMessage For="@(() => Board.Name)" />
</div>
</div>
<div class="form-group row">
<label for="Description" class="col-sm-2 col-form-label">Description</label>
<div class="col-sm-10">
<InputText id="Description" class="form-control" placeholder="Description" @bind-Value="Board.Description" />
<ValidationMessage For="@(() => Board.Description)" />
</div>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</EditForm>
@code {
private void GoToHome()
{
Navigation.NavigateTo("/");
}
private Board Board { get; set; } = new Board();
private Dictionary<Guid, Company> Companies = new Dictionary<Guid, Company>();
protected override async Task OnInitializedAsync()
{
try
{
Companies = await Http.GetFromJsonAsync<Dictionary<Guid, Company>>("api/Companies");
}
catch (Exception)
{
Console.WriteLine("Exception occurred for GET companies");
}
}
private async void HandleValidSubmit()
{
try
{
var response = await Http.PostAsJsonAsync("/api/Boards", Board);
response.EnsureSuccessStatusCode();
var content = await response.Content.ReadAsStringAsync();
var board = JsonConvert.DeserializeObject<Board>(content);
Navigation.NavigateTo($"/read_board/{board.Id}");
}
catch (Exception)
{
Console.WriteLine("Exception occurred for POST board");
}
}
}
【问题讨论】:
标签: c# api object constructor blazor