Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AJAX error not returning jqXHR.responseText.modelState when using custom dll

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.

like image 262
Grizzly Avatar asked Aug 28 '17 14:08

Grizzly


1 Answers

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;
}
like image 200
Grizzly Avatar answered Sep 26 '22 02:09

Grizzly