'Angular 12 .Net 6 value null being passed to api as "null"

I have an angular 12 UI that is communicating with a .net 6 API. When a parameter in a query string is null or undefined the API is interpreting it as a string value of "null" or "undefined". Relevant code below

angular code:

getDummyUser(type: string, testId: string):
Observable<UserDto> {
var url = `api/users/get-dummy-user?type=${encodeURIComponent(type)}&testId=${encodeURIComponent(testId)}`;
return this.httpClient.get<any>(url)
  .pipe(
    finalize(() =>
      this.hideLoadingIndicators()
    ),
    catchError(err => {
      return throwError(err);
    })
  );

}

.net 6 api parameter signature

[HttpGet]
    [Route("get-dummy-user")]
    public async Task<IActionResult> GetDummyUser
        (
        string type, 
        string testId
        )

I have tried using the [FromQuery] attribute but the result is the same. I also cannot send '' from the angular app as the API will then throw a 400 error (bad request). Has anyone had any experience in this? Thanks in advance



Solution 1:[1]

Add filter model in Angular and use it to send the request from Angular to .net example : FiltersModel.ts

export class GetDummy{

    type: string| null
    testId: string |null

  
}
   

Component.ts (where you send the request to backend)

 let filters:GetDummy = new GetDummy();
 filters.type="exampleType";
   let filterToSend="";
    Object.entries(filters).forEach(res=>{
      filterToSend+="&"+res[0]+"="+res[1];
   
    }); 
     var url='api/users/get-dummy-user?'+filterToSend);

And with this the request will be

http//:api/users/get-dummy-user?type="exampleType"

it's a way to send only the needed options to backend and the testId will be not be send as options

Solution 2:[2]

I don't know if this is something to do with new .net 6 or angular 12 but it appears that nowadays you have to send an empty string as the parameter AND make string nullable on the .net side. I'm not sure why string has to be declared as nullable now when it is... inherently nullable. Having issues with code formatting, apologies. Working solution below

getDummyUser(type) {
  this.userProvider.getDummyUser(type, '').subscribe(u => {
});




getDummyUser(type: string, testId: string):Observable<UserDto> {var url = `api/users/get-dummy-usertype=${encodeURIComponent(type)}&testId=${encodeURIComponent(testId)}`;return this.httpClient.get<any>(url).pipe(
finalize(() =>
  this.hideLoadingIndicators()
),
catchError(err => {
  return throwError(err);
})

);

  [HttpGet]
[Route("get-dummy-user")]
public async Task<IActionResult> GetDummyUser
    (
    [FromQuery] string type, 
    [FromQuery] string? testId
    )

Solution 3:[3]

export interface IGetDummy{
type: string;
testId?: string;

}

   sendingParams=[
//what u send as parameter to thi Api
]



 getDummyUser(params:Params):{

    return this.http.get<IGetDummy>(url,{observe:'response', sendingParams})
      .pipe(
        finalize(()=>{
          this.hideLoadingIndicators();
        },catchError(err => {
  return throwError(err);
      )

}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Akrem
Solution 2 TopBanana9000
Solution 3