trajce
trajce

Reputation: 1490

controller httpresponsemessage OK, but ajax always fires the fail method

im experiencing a weird problem.

I work with MVC (not web api), so the controller inherits from Controller, not from ApiController.

Im calling a controller action (POST) with ajax, and the action is returning HttpResponseMessage

This is the response i get:

{"readyState":4,"responseText":"StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StringContent, Headers:\r\n{\r\n  Location: /\r\n  Content-Type: application/json; charset=utf-8\r\n}","status":200,"statusText":"OK"}

However, when ajax receives the data, it fires the fail method.

This is the ajax function:

$.ajax({
    url: "someurl",
    type: "post",
    data: data,
    dataType: "json",
    contentType: "application/json; charset=utf-8"
}).done(function (data) {
    alert(data.responseText);
    window.location.href = "redirect to some url";
}).fail(function (data) {
    alert("error");<-- this one is called even when i set HttpStatusCode.OK
    alert(JSON.stringify(data));
}).always(function () {
});

This is a simplified controller action:

[HttpPost]
[AllowAnonymous]
public HttpResponseMessage Index(HttpRequestMessage request, Login model)
//public HttpResponseMessage Index(Login model) // i get the same with any of these 2
{
    HttpResponseMessage response = new HttpResponseMessage();
    string message = "";
    if (something)
    {
        response.StatusCode = HttpStatusCode.OK;
        FormsAuthentication.SetAuthCookie(model.UserName, true);
        currentUser.LastLoginDate = DateTime.Now;
        currentUser.FailedPasswordAttemptCount = 0;
        ModelRepositories.MobileCommerceRepository.SaveChanges();
    }
    else
    {
        message = "User does not exist. The user name or password provided is incorrect.";
        response.StatusCode = HttpStatusCode.BadRequest;
    }

    //response = request.CreateResponse(HttpStatusCode.OK);
    string json = JsonSerializer.SerializeToString(message);
    response.Content = new StringContent(json, Encoding.UTF8, "application/json");
    return response;
}

If i do the same ajax call to web api controller instead (with the same C# code inside), it fires success. What is the difference ?

Thanks

Upvotes: 2

Views: 9521

Answers (2)

Kumar Nitesh
Kumar Nitesh

Reputation: 1652

Just putting my answer if anyone is still looking. I agree with previous post as MVC will not return actual content. Instead I used

 public async Task<string> GetAjaxCollateralSummary(string id)
{
//your logic
  return JsonConvert.SerializeObject(result);
}

and the in my js page I have following code:

  $.post(url, { id: '2' })
                    .success(function (response) {
                        console.log(response);
                        var jsondResult = JSON.parse(response);                      
                    }
                        )
                .error(function (err) {
                    console.log("Error while trying to get data from MVC controller  ");
                    console.log(err);
                })

Upvotes: 0

Darrel Miller
Darrel Miller

Reputation: 142094

You cannot use HttpResponseMessage with an MVC action. Web API and MVC are two different frameworks, you can't mix and match pieces of them.

Upvotes: 8

Related Questions