2013-03-14 1 views
8

У меня есть этот вызов jquery post, который каким-то образом вызывает функцию ошибки, даже если он вводит данные в базу данных отлично.Функция ошибки вызова JSON Post

<script type="text/javascript"> 
    $(document).ready(function() { 
     $("#ExtMailCreate").click(function() { 
      var url = '@Url.Action("Create")'; 
      var data = JSON.stringify(SaveExternalMail()); 
      $.ajax({ 
       type: "POST", 
       url: url, 
       data: data, 
       dataType: "json", 
       contentType: "application/json; charset=utf-8", 
       success: function (data) { 
        $("#result").append("pass"); 
       }, 
       error: function (data) { 
        $("#result").append("error"); 
       } 
      }); 
     }); 
    }); 

    function SaveExternalMail() { 
     var costcentrecode = $("#CostCentreCode").val(); 
     var day = $("#ExtMailDatePicker").val(); 
     var externalMailItemID = $("#ExternalMailItemID").val(); 
     var externalMailLocationID = $("#ExternalMailLocationID").val(); 
     var quantity = $("#Quantity").val(); 
     return { 
      CostCentreCode: costcentrecode, 
      Day: day, 
      ExternalMailItemID: externalMailItemID, 
      ExternalMailLocationID: externalMailLocationID, 
      Quantity: quantity 
     }; 
    } 
</script> 

- контроллер

<HttpPost()> _ 
    Function Create(ByVal collection As ExternalMail) As JsonResult 
     Try 
      If ModelState.IsValid Then 
       _repositoryForExternalMail.Save(collection, "") 
      End If 

      Return Json(New ExternalMail With {.CostCentreCode = collection.CostCentreCode, .Day = collection.Day, .Quantity = collection.Quantity}, JsonRequestBehavior.AllowGet) 

     Catch ex As Exception 
      Return Json("An Error Occurred") 
     End Try 
    End Function 

---- UPDATE ---

Google хром сообщает следующее сообщение об ошибке:

POST localhost/Mail/ExternalMail/Create 403 (Forbidden)
jquery.min.js:4 send jquery.min.js:4 f.extend.ajax
jquery.min.js:4 (anonymous function) Create:59 f.event.dispatch
jquery.min.js:3 h.handle.i

- Page Source

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8" /> 
<title>Create</title> 
<link href="/Mail/Content/Site.css" rel="stylesheet" type="text/css" /> 
<link rel="stylesheet" type="text/css" href="/Mail/Scripts/jqModal.css" /> 
<link href="http://cdn.kendostatic.com/2012.2.913/styles/kendo.common.min.css" rel="stylesheet" type="text/css" /> 
<link href="http://cdn.kendostatic.com/2012.2.913/styles/kendo.dataviz.min.css" rel="stylesheet" type="text/css" /> 
<link href="http://cdn.kendostatic.com/2012.2.913/styles/kendo.blueopal.min.css" rel="stylesheet" type="text/css" /> 

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"> </script> 
<script src="/Mail/Scripts/json2min.js" type="text/javascript"></script> 
<script src="/Mail/Scripts/jquery.JSONP.min.js" type="text/javascript"></script> 
<script src="/Mail/Scripts/jquery.validate.min.js" type="text/javascript"></script> 
<script src="/Mail/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript">   </script> 

<script src="http://cdn.kendostatic.com/2012.2.913/js/kendo.all.min.js" type="text/javascript"></script> 
<script src="http://cdn.kendostatic.com/2012.2.913/js/kendo.aspnetmvc.min.js" type="text/javascript"></script> 
<script src="/Mail/Scripts/modernizr-1.7.min.js" type="text/javascript"></script> 
<script type="text/javascript" src="/Mail/Scripts/jqModal.js"></script> 

</head> 
<body> 
<div class="page"> 
    <header> 
    <div id="pageheader"> 
     <div id="pageheader_left"> 
      <img id="TitleBanner" src=/Mail/Content/Images/titlebanner.jpg alt="TitleBanner"/> 
     </div> 
     <div id="pageheader_center"> 

     </div> 
     <div id="pageheader_right"> 
     <a href="/Mail/" title="Click to go to Home Page"><img id="HomeImage" src=/Mail/Content/Images/home.gif alt="Home"/></a> 
     <a href="/Mail/Account/About"><img id="AboutImage" src=/Mail/Content/Images/about.gif alt="About"/></a> 
      <a href="/Mail/Account/Logoff"><img id="ExitImage" src=/Mail/Content/Images/logoff.gif alt="Exit"/></a> 
     </div>  
     <div id="pageheader_lower"> 
     </div>  
    </div> 


    <ul class="k-widget k-reset k-header k-menu" id="Menu"><li class="k-item k-state-default"> 
<a class="k-link" href="/Mail/">Home</a></li><li class="k-item k-state-default"><span class="k-link">Manage<span class="k-icon k-i-arrow-s"></span></span><ul class="k-group"><li class="k-item k-state-default"><span class="k-link">External Mail<span class="k-icon k-i-arrow-e"></span></span><ul class="k-group"><li class="k-item k-state-default"><a class="k-link" href="/Mail/ExternalMail">External Mail</a></li><li class="k-item k-state-default"><a class="k-link" href="/Mail/ExternalMailCategory">External Mail Category</a></li><li class="k-item k-state-default"><a class="k-link" href="/Mail/ExternalMailItem">External Mail Item</a></li><li class="k-item k-state-default"><a class="k-link" href="/Mail/ExternalMailCost">External Mail Cost</a></li><li class="k-item k-state-default"><a class="k-link" href="/Mail/ExternalMailLocation">External Mail Location</a></li><li class="k-item k-state-default"><a class="k-link" href="/Mail/ExternalMailInvoice">External Mail Invoice</a></li></ul></li><li class="k-item k-state-default"><span class="k-link">Internal Mail<span class="k-icon k-i-arrow-e"></span></span><ul class="k-group"><li class="k-item k-state-default"><a class="k-link" href="/Mail/InternalMail">Internal Mail</a></li><li class="k-item k-state-default"><a class="k-link" href="/Mail/InternalMailCategory">Internal Mail Category</a></li><li class="k-item k-state-default"><a class="k-link" href="/Mail/InternalMailItem">Internal Mail Item</a></li><li class="k-item k-state-default"><a class="k-link" href="/Mail/InternalMailCost">Internal Mail Cost</a></li><li class="k-item k-state-default"><a class="k-link" href="/Mail/InternalMailLocation">Internal Mail Location</a></li></ul></li><li class="k-item k-state-default"><a class="k-link" href="/Mail/CostCentre">Cost Centre</a></li></ul></li><li class="k-item k-state-default"><span class="k-link">Reports</span></li></ul><script> 
jQuery(function(){jQuery("#Menu").kendoMenu({});}); 
</script>    
    </header> 
    <section id="main"> 

<div class="jqmWindow" id="dialog"> 
    <a href="#" class="jqmClose">Close</a> 
</div> 


<script type="text/javascript"> 

$(document).ready(function() { 

    var exturl = '/Mail/ExternalMail/Create'; 
    $("#ExtMailCreate").click(function() { 


     var dataJSON = JSON.stringify(SaveExternalMail()); 

     $.ajax({ 
        cache: false, 
         type: "POST", 
         url: exturl, 
         data: dataJSON, 
         contentType: 'application/json; charset=utf-8', 
         success: function (data) { 
          showMessage("test", "information"); 
         }, 
         error: function (xhr, textStatus, errorThrown) { 
          showMessage("An error occurred while adding this record.   Please try again later.", "error"); 
         } 


        }); 

    }); 

}); 

function showMessage(message, messageType) { 
    $().ready(function() { 
     $('#dialog').jqm(); 

     switch (messageType) { 
      case 'information': 
       $('#dialog').removeClass("errorMessage"); 
       $('#dialog').addClass("informationMessage"); 
       break; 
      case 'error': 
       $('#dialog').removeClass("informationMessage"); 
       $('#dialog').addClass("errorMessage"); 
       break; 
      default: 
       break; 
     } 

     $('#dialog').html("<a href=\"#\" class=\"jqmClose\">Close</a><br />" + message); 
     $('#dialog').jqmShow(); 
    }); 
} 


    function SaveExternalMail() { 
     var costcentrecode = $("#CostCentreCode").val(); 
     var day = $("#ExtMailDatePicker").val(); 
     var externalMailItemID = $("#ExternalMailItemID").val(); 
     var externalMailLocationID = $("#ExternalMailLocationID").val(); 
     var quantity = $("#Quantity").val(); 

     return { CostCentreCode: costcentrecode, Day: day, ExternalMailItemID:  externalMailItemID, ExternalMailLocationID: externalMailLocationID, Quantity: quantity }; 
    } 

</script> 
<form action="/Mail/ExternalMail/Create" method="post"> <fieldset> 
    <legend>ExternalMail</legend> 
    <div class="editor-label"> 
     <label for="ExternalMailLocationID">Please select a Location</label> 
    </div> 
    <div class="editor-field"> 
     <select data-val="true" data-val-number="The field ExternalMailLocationID must be a number." data-val-required="The ExternalMailLocationID field is required." id="ExternalMailLocationID" name="ExternalMailLocationID"> 
<option value="2">Sydney</option> 
</select> 
     <span class="field-validation-valid" data-valmsg-for="ExternalMailLocationID" data-valmsg-replace="true"></span> 
    </div> 
    <div class="editor-label"> 
     <label for="CostCentreCode">Please select a CostCentre</label> 
    </div> 
    <div class="editor-field"> 
     <select id="CostCentreCode" name="CostCentreCode" size="15"><option value="Test000">Test</option> 
     </select> 
     <span class="field-validation-valid" data-valmsg-for="CostCentreCode" data-valmsg-replace="true"></span> 
    </div> 
     <div class="editor-label"> 
      <label for="ExternalMailItemID">Please select a Mail Item Type</label> 
     </div> 
     <div class="editor-field"> 
      <select data-val="true" data-val-number="The field ExternalMailItemID must be a number." data-val-required="The ExternalMailItemID field is required." id="ExternalMailItemID" name="ExternalMailItemID"><option value="4">Test10</option> 
     </select> 
     <span class="field-validation-valid" data-valmsg-for="ExternalMailItemID" data-valmsg-replace="true"></span> 
    </div> 
    <div class="editor-label"> 
     <label for="Day">Please select a Date</label> 
    </div> 
    <div class="editor-field"> 
     <input class="k-input" id="ExtMailDatePicker" name="ExtMailDatePicker" type="date" value="19/03/2013" /><script> 
    jQuery(function(){jQuery("#ExtMailDatePicker").kendoDatePicker({"format":"d/MM/yyyy","min":new Date(1900,0,1,0,0,0,0),"max":new Date(2099,11,31,0,0,0,0)});}); 
     </script> 
     <span class="field-validation-valid" data-valmsg-for="Day" data-valmsg-replace="true"></span> 
    </div> 
    <div class="editor-label"> 
     <label for="Quantity">Please enter the no of Mails</label> 
    </div> 
    <div class="editor-field"> 
     <input class="text-box single-line" data-val="true" data-val-number="The field Quantity must be a number." data-val-required="The Quantity field is required." id="Quantity" name="Quantity" type="text" value="" /> 
     <span class="field-validation-valid" data-valmsg-for="Quantity" data-valmsg-replace="true"></span> 
    </div> 
    <p> 
     <input type="button" value="Create" id="ExtMailCreate" /> 
    </p> 
</fieldset> 
</form><div> 
<a href="/Mail/ExternalMail">Back to List</a> 
</div> 
     <div id="result"> 
</div> 

    </section> 
    <footer> 

    </footer> 
</div> 
</body> 
</html> 

- Ajax запрос Respone

Request URL:http://localhost/Mail/ExternalMail/Create 
Request Method:POST 
Status Code:403 Forbidden 
Request Headersview source 
Accept:*/* 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6 
Authorization:Negotiate TlRMTVNTUAADAAAAAAAAAEgAAAAAAAAASAAAAAAAAABIAAAAAAAAAEgAAAAAAAAASAAAAAAAAABIAAAABcKIogUBKAoAAAAP 
Connection:keep-alive 
Content-Length:113 
Content-Type:application/json; charset=UTF-8 
Cookie:ASP.NET_SessionId=tg1xrabaigumj3fxooa1satc 
DNT:1 
Host:localhost 
Origin:http://localhost 
Referer:http://localhost/Mail/externalmail/Create 
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.22 (KHTML, like Gecko)  Chrome/25.0.1364.172 Safari/537.22 
X-Requested-With:XMLHttpRequest 
Request Payload 
{"CostCentreCode":"B125","Day":"20/03/2013","ExternalMailItemID":"4","ExternalMailLocationID":"1","Quantity":"2"} 
Response Headersview source 
Cache-Control:private, s-maxage=0 
Content-Length:127 
Content-Type:application/json; charset=utf-8 
Date:Wed, 20 Mar 2013 01:31:21 GMT 
Server:Microsoft-IIS/5.1 
X-AspNet-Version:4.0.30319 
X-AspNetMvc-Version:3.0 
X-Powered-By:ASP.NET 
+0

Если вы поставили точку останова на 'Return Json (« Ошибка возникла »), что произойдет? Это удар? –

+0

нет, он не попадает. – Baahubali

+0

Вы когда-нибудь нажимали на свой метод Create? –

ответ

2

Я думаю, что проблема определения JsonRequestBehavior.AllowGet

, а затем разместить методу:

$.ajax({ 
    type: "POST", 
    url: url, 

Если база данных становится заселена, мы знаем, код репозитория запускается. Браузер сообщает, что HTTP403, который пахнет, как фреймворк, бросает исключение безопасности, которое он может делать, если он ожидает ответа на GET и получает POST.

+0

. Я попытался удалить JsonRequestBehavior.AllowGet, но ошибка все же остается. – Baahubali

0

запрос ajax войдет в блок ошибок, если вы укажете, что тип данных json, но ответ не может быть проанализирован как json.

Откройте хром и поместите точку останова в блок ошибок и посмотрите на значение данных. поместите содержимое в json validator и убедитесь, что ваш ответ действителен json.

также изменить метод Sigs ваших функций успеха и ошибок в

success: function(data, txtStatus, jqxhr){ // code here } 
error: function(jqxhr, txtStatus, errorThrown) { // code here } 

затем размещение контрольных точек в этих Funcitons вы можете проверить Params и посмотреть, что происходит на более четко.

- Обновление Поскольку вы получаете 403 код ошибки, см этот ответ на StackOverflow и проверить права доступа к папке, которые указывают на

403 forbidden after publishing asp.net MVC

также взглянуть на это, так как вам работают IIS 5.1 это выглядит как ... он может быть похож

Running MVC2 Application on IIS 5.2

+0

все еще сообщают о тех же проблемах после завершения всех описанных выше шагов. – Baahubali

0

Попробуйте изменить метод в контроллере от JsonResult к Acti onResult

<HttpPost()> _ 
    Function Create(ByVal collection As ExternalMail) As ActionResult 
0

Как сказал ДЭНАС, нужно, чтобы проверить, что в возвращенных textStatus и errorThrown генерироваться переменных, потому что вы можете иметь что-то другое, чем код 200 HTTP вернулся и ваш код все еще выполняется нормально (что имеет место поскольку вы сообщаете, что ваши записи добавляются в базу данных). 200 HTTP-код вызовет функцию «успех», и я не могу вспомнить прямо сейчас, но что-то в 4xx или 5xx должно вызвать функцию «ошибка».

Главное, чтобы принять во внимание в том, что это HTTP код возврата Вебсервер в то, что управляет тем, что функция вызывается при вызове JQuery Ajax

Изменить код:

error: function(jqXHR, textStatus, errorThrown) { 
    console.log(textStatus); 
    console.log(errorThrown); 
} 

и расскажите нам что у вас есть в этих переменных textStatus и errorThrown.

Смежные вопросы