我可以在HttpParams中发送对象吗?

时间:2019-06-14 08:56:45

标签: angular typescript

我有一个界面,其中profileRoles字段是一个对象

export interface IRegisterModel extends IModelWithToken {
    firstName: string;
    fatherName: string;
    lastName: string;
    email: string;
    dateBirth?: string;
    regionId: number;
    mobilePhone: string;
    profileRoles?: { isStudent: boolean };
}

我尝试将其发送到mvc控制器。以下是角度服务方法:

public register(registerModel: IRegisterModel): Observable<any> {
    const params = new HttpParams()
        .append("userName", registerModel.email)
        .append("firstName", registerModel.firstName)
        .append("fatherName", registerModel.fatherName)
        .append("lastName", registerModel.lastName)
        .append("email", registerModel.email)
        .append("mobilePhone", registerModel.mobilePhone)
        .append("registrationRegionId", registerModel.regionId.toString())
        .append("__RequestVerificationToken", registerModel.token);
        if (registerModel.dateBirth) {
            params.append("dateBirth", registerModel.dateBirth);
        }
        if (registerModel.profileRoles) {
            params.append("profileRoles.isStudent", registerModel.profileRoles.isStudent.toString());
        }
    return this.httpClient.post("/Account/Register", params);
}

registerModel.profileRoles.isStudent包含必需的值,但未附加到参数中。我认为profileRoles.isStudent是错误的语法。我该如何修复并将对象附加到HttpParams?

2 个答案:

答案 0 :(得分:1)

根据HttpParams规范,HttpParams是不可变的。

This class is immutable - all mutation operations return a new instance.

https://angular.io/api/common/http/HttpParams

当您尝试附加新参数时,使用

params.append("dateBirth", registerModel.dateBirth);

params.append("profileRoles.isStudent", registerModel.profileRoles.isStudent.toString());

它并没有改变您原来的params变量。

如第一个引号中所述,所有变异操作都返回一个新实例,因此,append()方法返回一个新的HTTPParams对象。您的代码应该可以通过简单地将其重新分配给params对象来工作。

if (registerModel.dateBirth) {
    params = params.append("dateBirth", registerModel.dateBirth);
}
if (registerModel.profileRoles) {
    params = params.append("profileRoles.isStudent", registerModel.profileRoles.isStudent.toString());
}

答案 1 :(得分:0)

FileStream

我认为您应该像这样重新定义界面,希望对您有所帮助!