2013-03-14 14 views
8

Mam to wywołanie jquery, które w jakiś sposób wywołuje funkcję błędu, mimo że wprowadza dane do bazy danych doskonale.JSON Funkcja wywołania błędu wywołania

<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> 

- sterownik

<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 Chrome zgłasza następujący błąd:

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

- Źródło strony

<!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 Zapytanie 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

Jeśli umieścisz punkt przerwania na 'Return Json (" Wystąpił błąd ")', co się stanie? Czy to trafiło? –

+0

nie, nie zostanie trafiony. – Baahubali

+0

czy kiedykolwiek trafiłeś w swoją metodę Create? –

Odpowiedz

2

Myślę, że problemem jest określenie JsonRequestBehavior.AllowGet

a następnie opublikowania metody:

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

Jeśli baza danych jest uzyskiwanie zaludnionych, wiemy, że uruchamia się kod repozytorium. Przeglądarka zgłasza HTTP403, który pachnie tak, jak framework wyrzuca wyjątek bezpieczeństwa, który może zrobić, jeśli oczekuje odpowiedzi na GET i otrzymuje POST.

+0

próbowałem usunąć JsonRequestBehavior.AllowGet, ale rzut błędów jest nadal taki sam. – Baahubali

0

żądanie ajax wejdzie w blok błędu, jeśli określisz, że typem danych jest json, ale odpowiedzi nie można przeanalizować jako json.

otwórz chrome i umieść punkt przerwania w bloku błędu i spójrz na wartość danych. umieść zawartość w walidatorze json i sprawdź, czy twoja odpowiedź jest poprawna json.

również zmienić sigs metoda swoimi funkcjami sukcesów i błędów do

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

następnie umieszczenie pułapki w tych funcitons można skontrolować params i zobaczyć, co dzieje się jaśniej.

- Aktualizacja Ponieważ otrzymujesz 403 kod błędu, zobacz tę odpowiedź na StackOverflow i sprawdzić uprawnienia do folderu są skierowane do

403 forbidden after publishing asp.net MVC

również spojrzeć na to od ciebie jest uruchomiony IIS 5.1 to wygląda ... może być podobna

Running MVC2 Application on IIS 5.2

+0

nadal zgłaszam te same problemy po wykonaniu wszystkich opisanych wyżej czynności. – Baahubali

0

Spróbuj zmienić metodę w kontroler z JsonResult do Acti onResult

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

Jak DENAS wspomnianego, trzeba sprawdzić, co jest w zwróconych textStatus i errorThrown generowane zmiennych, ponieważ można mieć coś innego niż kod 200 HTTP powrócił i kod nadal wykonywane w porządku (co jest w przypadku ponieważ raportujesz, że twoje rekordy są dodawane do bazy danych). Kod HTTP 200 wywoła funkcję "powodzenia", a ja nie pamiętam w tej chwili, ale coś w 4xx lub 5xx powinno wywołać funkcję "błędu".

Główną rzeczą, aby wziąć pod uwagę, jest to, że jest to serwer www Kod powrotu HTTP co kontroluje co funkcja jest wyzwalany w zaproszeniu jquery ajax

Zmień swój kod do:

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

i powiedz nam co masz w tych zmiennych textStatus i errorThrown.

Powiązane problemy