@@ -51,15 +51,15 @@ public override async Task<IActionResult> GetAsync(CancellationToken cancellatio
51
51
/// <inheritdoc />
52
52
[ HttpGet ( "{id}" ) ]
53
53
[ HttpHead ( "{id}" ) ]
54
- public override async Task < IActionResult > GetAsync ( [ Required ] [ DisallowNull ] TId id , CancellationToken cancellationToken )
54
+ public override async Task < IActionResult > GetAsync ( [ Required ( AllowEmptyStrings = true ) ] [ DisallowNull ] TId id , CancellationToken cancellationToken )
55
55
{
56
56
return await base . GetAsync ( id , cancellationToken ) ;
57
57
}
58
58
59
59
/// <inheritdoc />
60
60
[ HttpGet ( "{id}/{relationshipName}" ) ]
61
61
[ HttpHead ( "{id}/{relationshipName}" ) ]
62
- public override async Task < IActionResult > GetSecondaryAsync ( [ Required ] [ DisallowNull ] TId id , [ Required ] string relationshipName ,
62
+ public override async Task < IActionResult > GetSecondaryAsync ( [ Required ( AllowEmptyStrings = true ) ] [ DisallowNull ] TId id , [ Required ] string relationshipName ,
63
63
CancellationToken cancellationToken )
64
64
{
65
65
return await base . GetSecondaryAsync ( id , relationshipName , cancellationToken ) ;
@@ -68,8 +68,8 @@ public override async Task<IActionResult> GetSecondaryAsync([Required] [Disallow
68
68
/// <inheritdoc />
69
69
[ HttpGet ( "{id}/relationships/{relationshipName}" ) ]
70
70
[ HttpHead ( "{id}/relationships/{relationshipName}" ) ]
71
- public override async Task < IActionResult > GetRelationshipAsync ( [ Required ] [ DisallowNull ] TId id , [ Required ] string relationshipName ,
72
- CancellationToken cancellationToken )
71
+ public override async Task < IActionResult > GetRelationshipAsync ( [ Required ( AllowEmptyStrings = true ) ] [ DisallowNull ] TId id ,
72
+ [ Required ] string relationshipName , CancellationToken cancellationToken )
73
73
{
74
74
return await base . GetRelationshipAsync ( id , relationshipName , cancellationToken ) ;
75
75
}
@@ -83,39 +83,41 @@ public override async Task<IActionResult> PostAsync([Required] TResource resourc
83
83
84
84
/// <inheritdoc />
85
85
[ HttpPost ( "{id}/relationships/{relationshipName}" ) ]
86
- public override async Task < IActionResult > PostRelationshipAsync ( [ Required ] [ DisallowNull ] TId id , [ Required ] string relationshipName ,
87
- [ Required ] ISet < IIdentifiable > rightResourceIds , CancellationToken cancellationToken )
86
+ public override async Task < IActionResult > PostRelationshipAsync ( [ Required ( AllowEmptyStrings = true ) ] [ DisallowNull ] TId id ,
87
+ [ Required ] string relationshipName , [ Required ] ISet < IIdentifiable > rightResourceIds , CancellationToken cancellationToken )
88
88
{
89
89
return await base . PostRelationshipAsync ( id , relationshipName , rightResourceIds , cancellationToken ) ;
90
90
}
91
91
92
92
/// <inheritdoc />
93
93
[ HttpPatch ( "{id}" ) ]
94
- public override async Task < IActionResult > PatchAsync ( [ Required ] [ DisallowNull ] TId id , [ Required ] TResource resource , CancellationToken cancellationToken )
94
+ public override async Task < IActionResult > PatchAsync ( [ Required ( AllowEmptyStrings = true ) ] [ DisallowNull ] TId id , [ Required ] TResource resource ,
95
+ CancellationToken cancellationToken )
95
96
{
96
97
return await base . PatchAsync ( id , resource , cancellationToken ) ;
97
98
}
98
99
99
100
/// <inheritdoc />
100
101
[ HttpPatch ( "{id}/relationships/{relationshipName}" ) ]
102
+ // `AllowEmptyStrings = true` in `[Required]` prevents the model binder from producing a validation error on whitespace when TId is string.
101
103
// Parameter `[Required] object? rightValue` makes Swashbuckle generate the OpenAPI request body as required. We don't actually validate ModelState, so it doesn't hurt.
102
- public override async Task < IActionResult > PatchRelationshipAsync ( [ Required ] [ DisallowNull ] TId id , [ Required ] string relationshipName ,
103
- [ Required ] object ? rightValue , CancellationToken cancellationToken )
104
+ public override async Task < IActionResult > PatchRelationshipAsync ( [ Required ( AllowEmptyStrings = true ) ] [ DisallowNull ] TId id ,
105
+ [ Required ] string relationshipName , [ Required ] object ? rightValue , CancellationToken cancellationToken )
104
106
{
105
107
return await base . PatchRelationshipAsync ( id , relationshipName , rightValue , cancellationToken ) ;
106
108
}
107
109
108
110
/// <inheritdoc />
109
111
[ HttpDelete ( "{id}" ) ]
110
- public override async Task < IActionResult > DeleteAsync ( [ Required ] [ DisallowNull ] TId id , CancellationToken cancellationToken )
112
+ public override async Task < IActionResult > DeleteAsync ( [ Required ( AllowEmptyStrings = true ) ] [ DisallowNull ] TId id , CancellationToken cancellationToken )
111
113
{
112
114
return await base . DeleteAsync ( id , cancellationToken ) ;
113
115
}
114
116
115
117
/// <inheritdoc />
116
118
[ HttpDelete ( "{id}/relationships/{relationshipName}" ) ]
117
- public override async Task < IActionResult > DeleteRelationshipAsync ( [ Required ] [ DisallowNull ] TId id , [ Required ] string relationshipName ,
118
- [ Required ] ISet < IIdentifiable > rightResourceIds , CancellationToken cancellationToken )
119
+ public override async Task < IActionResult > DeleteRelationshipAsync ( [ Required ( AllowEmptyStrings = true ) ] [ DisallowNull ] TId id ,
120
+ [ Required ] string relationshipName , [ Required ] ISet < IIdentifiable > rightResourceIds , CancellationToken cancellationToken )
119
121
{
120
122
return await base . DeleteRelationshipAsync ( id , relationshipName , rightResourceIds , cancellationToken ) ;
121
123
}
0 commit comments