Darren Young
Darren Young

Reputation: 11100

MVC3 call controller method from ajax

I have the following code:

$.ajax({
    type: "GET",
    url: "/Search/GetNewData"  //Controller/ActionMethod
   ---snip---
)};

This works fine when run via localhost, however when it is deployed, it cannot find the controller method. I think it's probably a routing problem? But, with only a small limited knowledge using ASP.net, I would appreciate some advice.

Thanks.

Upvotes: 1

Views: 4406

Answers (3)

Bertrand Marron
Bertrand Marron

Reputation: 22220

You really don't want to specify the URL directly in your JavaScript.

You need to use helpers; otherwise if you change your routes, you'll have to rewrite all the URLS in your JavaScript code. Also, it won't work if your website is hosted in a IIS virtual directory (what seems to be the issue here).

You have a couple solutions here, if your JavaScript code is embedded inside a view, simply use

$.ajax({
    type: 'GET',
    url: '@Url.Action("GetNewData", "Search")'
)};

If it's inside an external JavaScript file, you could, for example, use HTML5 data-* attributes to share the URL to your JavaScript code.

For example:

<div id="foo" data-update-url="@Url.Action("GetNewData", "Search")">
</div>

Then the JavaScript code would be something like

var updateDiv = $('#foo');
$.ajax({
    type: 'GET',
    url: updateDiv.data('update-url'),
    success: function(data) {
       updateDiv.append(data);
    }
)};

Upvotes: 3

user338195
user338195

Reputation:

Install FireBug for FireFox. Open .NET panel and Console panels. Request the URL to see whether you get any errors. If none found, then learn to use a debugger. This is by no means a quick fix, but it will help you in the future to fix these sort of problems yourself. Good luck.

Upvotes: 0

jgauffin
jgauffin

Reputation: 101192

The following snippet would work for both virtual directories and web sites.

var baseUri = '@Url.Content("~/")';
$.ajax({
    type: "GET",
    url: baseUri + "Search/GetNewData"  //Controller/ActionMethod
   ---snip---
)};

You can also define the baseUri variable in your layout (above all <script tags) to be able to use it in all included javascripts.

Upvotes: 2

Related Questions