I'm trying to learn .NET Core; my background is largely PHP where the absence of a type system makes what I'm trying to do here trivial.
I'm trying to create an API with a small wrapper for the response. So that instead of sending {"user": "..."}
I can send {"message": "...", "data": {"user": "..."}}
To start, I began with a POCO for the wrapper:
public class AppResponse<T>
{
public string Message { get; set; }
public T data { get; set; }
}
Then, I instantiate the wrapper differently each time I need a response object:
[HttpPost]
public async Task<IActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
var okResponse = new AppResponse<RegisterViewModel>();
okResponse.Message = "Your account has been created.";
return Ok(okResponse);
}
else
{
var errorResponse = new AppResponse<IEnumerable<IdentityError>>();
errorResponse.data = result.Errors;
return BadRequest(errorResponse);
}
}
var badRequest = new AppResponse<RegisterViewModel>();
badRequest.data = model;
return BadRequest(badRequest);
}
Is there an easier/better way to do this in .NET Core? I intend for this to be a Web API, so the ability to make more complicated JSON responses (for things such as pagination, validation errors, etc.) is crucial.
I apologize for the confusion of camel case in variables, I'm still figuring out best practices in C#.
EDIT: I have simplified my code to use a more RESTful approach. This is it currently:
public async Task<IActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
return Ok(user);
}
return BadRequest(result);
}
// If we got this far, something failed.
return BadRequest(new
{
Errors = ModelState
});
}