5

I'm working in an MVC 3 application with ASPX engine and as a point of start I developed a simple search that utilizes a JQuery JSON call to retrieve some info. The call sends a parameter taken from a text input and updates a table with the results. The funcion look like this:

        function PerformLookup() {
            var _accountNumber = $('#accountNumber').val();

            $.ajax({
                url: '/SearchAjax/SearchAccount',
                type: 'POST',
                data: '{_accountNumber:'+_accountNumber+'}',
                dataType: 'json',
                contentType: 'application/json; charset=utf-8',
                success: function (data) {
                    UpdateTable(data);
                },
                error: function () {
                    alert('An error occurred while performing the search.');
                }
            });

            return false;
        }

The server code runs a query with that parameter and returns a list that is serialized to JSON to be worked normally with JQuery. The server code looks like this:

        [HttpPost]
        public JsonResult SearchAccount(string _accountNumber)
        {
            MLIBEntities dbMLIB = new MLIBEntities();

            var searchResults = (from s in dbMLIB.Sets
                                 where s.setmap1 == _accountNumber
                                 select s);
            return Json(searchResults.ToList());
        }

As you see it's nothing difficult and it works perfectly when I run the project from VS2010 and use its virtual machine.

The problem happens when I publish the project in a Windows 2008 server with IIS 7. The project runs normally but when I run the PerformLookup function I get the message "An error occurred while performing the search" meaning that the ajax call failed.

Does anyone have any idea why the call is failing in the IIS while working perfectly in the VS2010 virtual machine? Am I missing any configuration IIS wise?

Thanks in advance!

1
  • Did you try usnig tools like Fiddler/HttpWatch/Firebug to check what is the response Content of AJAX call. That may have some relevant information which can help debug further Commented Feb 18, 2011 at 16:51

2 Answers 2

10

Never hardcode urls like this because when you deploy your application there could be a virtual directory prepended to your urls:

url: '/SearchAjax/SearchAccount',

Always use Url helpers when dealing with urls:

url: '<%= Url.Action("SearchAccount", "SearchAjax") %>',

So here's how I would refactor your code:

function PerformLookup() {
    var _accountNumber = $('#accountNumber').val();
    $.ajax({
        url: '<%= Url.Action("SearchAccount", "SearchAjax") %>',
        type: 'POST',
        data: JSON.stringify({ _accountNumber: _accountNumber }),
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        success: function (data) {
            UpdateTable(data);
        },
        error: function () {
            alert('An error occurred while performing the search.');
        }
    });
    return false;
}

or if this PerformLookup function is called when some link is clicked, I would have the link generated with an HTML helper:

<%= Html.ActionLink(
    "Perform search", 
    "SearchAccount", 
    "SearchAjax", 
    null, 
    new { id = "search" }
) %>

and then simply AJAXify it:

$(function() {
    $('#search').click(function() {
        var _accountNumber = $('#accountNumber').val();
        $.ajax({
            url: this.href,
            type: 'POST',
            // Probably no need to send JSON request
            // so I've replaced it with a standard
            // application/x-www-form-urlencoded POST request
            data: { _accountNumber: _accountNumber },
            dataType: 'json',
            success: function (data) {
                UpdateTable(data);
            },
            error: function () {
                alert('An error occurred while performing the search.');
            }
        });
        return false;
    });
});

And finally I would strongly recommend you using FireBug which is an excellent tool allowing you to debug this kind of problems as it shows all AJAX requests and what's happening between the client and the server.

Sign up to request clarification or add additional context in comments.

1 Comment

I used the first refactor you present with the URL helper and the JSON.stringify function and it worked like a charm from IIS. Thanks a lot man, you sure know what you're doing.
0

just put the full URL in javascript:

$.ajax({
    type: "POST",
    url: "/Appnamehere/Controller/Action", ...

this work fine..

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.