2016-02-24 2 views
2

Я пытаюсь обновить записи в базе данных с помощью запросов AJAX. Я могу вставить, используя, как показано ниже, но не удастся, когда пытаюсь обновить или удалить.AJAX PUT Request to C# Controller

Вот мой Аякса метод PUT:

$('#updateCr').click(function(e) { 
    e.preventDefault(); 
    var updatedData = { 
     CrId: $('#CrId').val(), 
     CrName: $('#CrName').val(), 
     CrStatus: $('#CrStatus').val(), 
     CrPriority: $('#CrPriority').val(), 
     CrTitle: $('#CrTitle').val(), 
     CrDescription: $('#CrDescription').val() 
    }; 
    console.log(changeRequest); 

    $.ajax({ 
     type: "PUT", 
     url: "@Url.Action("MyControllerAction", "Home")", 
     content: "application/json; charset=utf-8", 
     dataType: "json", 
     data: updatedData, 
     cache: false, 
     success: function(d) { 
      if (d.success == true) 
       window.location = "index.html"; 
      else {} 
     }, 
     error: function(xhr, textStatus, errorThrown) { 
      // TODO: Show error 
     } 
    }); 

А вот мой контроллер

[HttpPut] 
public JsonResult MyControllerAction(UpdatedDataObject updatedData) 
{ 
    try 
    { 
     myModel.UpdateDataMethod(updatedData); 
    } 
    catch (Exception e) 
    { 
     var theerrror = e.ToString(); 
     return Json(new { result = theerrror }); 
    } 

    return Json(new { result = "Success" }); 
} 

При представлении данных, контроллер запускается, но он не получает объект JSON. Что я здесь делаю неправильно?

+1

вы проверили реакцию на консоли или, по крайней мере, активизировали через код C#, чтобы увидеть, если какие-либо ошибки бросили? –

+0

Да, консоль показывает объект json, и я прошел через код C# ... никаких ошибок не было, контроллер просто не получает объект JSON, который я пытаюсь передать ему. –

+2

Проблема - опечатка. Возвращенное свойство JSON называется 'result'. В вашем JS-коде вы используете 'success' –

ответ

1

Вопрос опечатка. Возвращенное свойство JSON называется result. В вашем JS-коде вы используете success. Также обратите внимание, что вы отправляете данные application/x-www-form-urlencoded, а не application/json. К счастью, это не проблема, так как ModelBinder будет работать для обоих типов запросов. Попробуйте это:

$.ajax({ 
    type: "PUT", 
    url: "@Url.Action("MyControllerAction", "Home")", 
    dataType: "json", 
    data: updatedData, 
    cache: false, 
    success: function(d) { 
     if (d.result) { 
      window.location.assign("index.html"); 
     } else { 
      console.log('do something constructive with the error here...'); 
     } 
    }, 
    error: function(xhr, textStatus, errorThrown) { 
     // TODO: Show error 
    } 
}); 

Наконец, это кажется немного излишним для перенаправления пользователя на другой экран, когда результат запроса AJAX является успешным. Если это поведение вам требуется, то точка AJAX является спорным, и вы можете также использовать стандартную форму представления.

+0

Так что это работает, но только когда я установите тип: «POST» ... он будет работать для меня на данный момент, но кажется странным, что он ударит по действию контроллера для одного, но не другого ... и да, я изменил атрибуты на их соответствующие типы при тестировании. Во всяком случае, спасибо за ваш ответ. Это работает, поэтому я буду отмечать его как правильное. –

0

Я обнаружил, что в том числе JSON.stringify() часто решает такого рода вопросы для меня

data: JSON.stringify(updatedData), 

всего кода будет выглядеть следующим образом:

$.ajax({ 
    type: "PUT", 
    url: "@Url.Action("MyControllerAction", "Home")", 
    content: "application/json; charset=utf-8", 
    dataType: "json", 
    data: JSON.stringify(updatedData), 
    cache: false, 
    success: function(d) { 
    if (d.success == true) 
    window.location = "index.html"; 
    else {} 
     }, 
     error: function(xhr, textStatus, errorThrown) { 
    // TODO: Show error 
    } 
}); 
+0

Спасибо, я дам этот снимок и вернусь к ya –

0

В дополнение к тому, что было указано выше, обратите внимание, что если глагольных заголовки для PUT и DELETE не работают, см реакция, представленная здесь:

ASP.NET Web API - PUT & DELETE Verbs Not Allowed - IIS 8

По сути все, что вам нужно это:

<system.webServer> 
<validation validateIntegratedModeConfiguration="false" /> 
<modules runAllManagedModulesForAllRequests="true"> 
    <remove name="WebDAVModule"/> 
    <remove name="FormsAuthentication" /> 
</modules> 
<handlers> 
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
</handlers>