【发布时间】:2020-04-18 00:12:08
【问题描述】:
我正在努力完成在我的 Angular 应用程序中创建一个具有 0-n 个子对象(文件“附件”)的对象(“票证”)并将信息发送到我的 dotnet 核心 Web Api 的任务。但这更像是一个合乎逻辑的问题。
当用户创建工单时,他应该能够向该工单添加附件。
关于如何上传文件的文章很多,但我不想要的是用户在创建票证时上传附件。我不希望这样,因为如果用户取消票证创建,我的存储(Azure)中将有未使用的附件,并且如果没有对 TicketId 的引用(这次不存在),我将无法创建附件对象) 在带有实体框架的服务器端。
所以我喜欢先收集所有信息,如果用户说“创建工单”,所有信息都会发送到 API,
- Ticket 对象将被创建
- 文件将根据文件信息上传(到 Azure)
- 附件对象已创建
- 附件对象被添加到工单中,并且
- 所有内容都保存到数据库中
Angular(客户端)
用于收集工单数据和选择附件文件的表单。界面是这样的:
export interface ITicketCreate {
subject: string;
content: string;
category: number;
userId: string;
userNickname: string;
email: string;
attachments: File[];
}
发送到 Api 的最终 Dto 对象如下所示:
具有 createTicket 功能的服务
export class SupportService {
supportUrl = environment.SupportApiUrl;
constructor(private http: HttpClient) { }
createTicket(model: ITicketCreate) {
return this.http.post(this.supportUrl + 'tickets', model);
}
...
}
以及 CreateTicketComponent 中的调用
ticket = {} as ITicketCreate;
...
ngOnInit() {
this.ticket.attachments = [];
}
createTicket() {
console.log(this.ticket);
this.ticket.userId = this.authService.currentUser.id;
this.ticket.userNickname = this.authService.currentUser.nickName;
this.ticket.email = this.authService.currentUser.userName;
this.supportService.createTicket(this.ticket).subscribe(next => {
this.alertify.success('Ticket created');
this.router.navigate(['/support/tickets']);
}, error => {
this.alertify.error(error);
console.log(error);
});
}
Web API (.Net Core 2.2)
在服务器端,我有以下 Dto 来接收数据:
public class CreateTicketDto
{
public string Subject { get; set; }
public string Content { get; set; }
public string UserId { get; set; }
public string Email { get; set; }
public string UserNickname { get; set; }
public int Category { get; set; }
public List<IFormFile> Attachments { get; set; } = new List<IFormFile>();
}
还有控制器动作
[HttpPost]
public async Task<IActionResult> CreateTicket(CreateTicketDto createTicket)
发送请求后我从 API 得到的错误是:
由于我没有输入控制器操作本身来进行调试,所以我的问题是:
- 这甚至可能是我喜欢的工作方式吗?
- 如果是,我错过了什么?
最好的问候, 凯
【问题讨论】:
标签: angular asp.net-web-api .net-core asp.net-core-webapi