I am using an asp.net webapi controller, and in my project I have a dll that I built myself. The dll is being used to validate if the person that the user is typing in actually exists.
Here is my controller method:
// POST: api/EventsAPI
[ResponseType(typeof(Event))]
public IHttpActionResult PostEvent(Event @event)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (@event.DateEndOfEvent < @event.DateOfEvent) // successfully returns error.modelState (in view code)
{
ModelState.AddModelError("DateEndOfEvent", "End Date Cannot Be Before Start Date!");
return BadRequest(ModelState);
}
if (!EmpData.IsValid(@event.PersonWorkedOne)) // returns error.modelState as undefined (in view code)
{
ModelState.AddModelError("PersonWorkedOne", "This person does not exist!");
return BadRequest(ModelState);
}
if (!string.IsNullOrWhiteSpace(@event.PersonWorkedTwo))
{
if (!EmpData.IsValid(@event.PersonWorkedTwo)) // returns error.modelState as undefined (in view code)
{
ModelState.AddModelError("PersonWorkedTwo", "This persondoes not exist!");
return BadRequest(ModelState);
}
}
db.Event.Add(@event);
db.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = @event.Id }, @event);
}
Now the two conditional statements above that have EmpData
.. EmpData
is from my dll.
Here is the ajax code in my view:
$("form").data("validator").settings.submitHandler =
function(form) {
$.ajax({
method: "POST",
url: infoGetUrl,
data: $("form").serialize(),
success: function() {
toastr.options = {
onHidden: function () {
window.location.href = newUrl;
},
timeOut: 3000
}
toastr.success("Event successfully created.");
},
error: function (jqXHR, textStatus, errorThrown) {
var status = capitalizeFirstLetter(textStatus);
var error = $.parseJSON(jqXHR.responseText);
var modelState = error.modelState;
console.log(modelState);
$.each(modelState,
function (key, value) {
var id = "";
if (key === "$id") {
id = "#" +
key.replace('$', '').substr(0, 1).toUpperCase() +
key.substr(2);
} else {
id = "#" +
key.replace('$', '').substr(0, 1).toUpperCase() +
key.substr(1);
var status = capitalizeFirstLetter(textStatus);
console.log(key);
toastr.error(status + " - " + modelState[key]);
}
var input = $(id);
console.log(id); // result is #id
if (input) { // if element exists
input.addClass('input-validation-error');
}
});
}
});
}
Now, in the controller when I purposefully test to get the error message concering the end date being before the start date, I receive error.modelState
. But when I purposefully test to get the error message saying that a person does not exist... I do not get error.modelState
.. that returns as undefined
.
Does returning ModelState not work when using custom DLL?
Any help is appreciated.
I was able to figure this out with the help of ADyson. I edited my DLL file to return just a bool object.
Originally if what I was checking in IsValid
was anything other than true, then I would throw an exception which was causing this error.
So taking the exception part out and just returning either true or false worked.
Original
public static bool IsValid(string person)
{
bool empExists = lstAllEmps.Any(x => x.IDNumber == person);
if (empExists)
{
return empExists;
}
else
{
var exceptionMessage = string.Format("The person, {0}, does not exist!", person);
throw new ArgumentException(exceptionMessage, person);
}
}
New
public static bool IsValid(string person)
{
bool empExists = lstAllEmps.Any(x => x.IDNum == person);
return empExists;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With