2012-04-13 16 views
1

Ich versuche, zwei Werte der folgenden Controller-Aktion jQueryPassing Wert Controller-Aktion

[HttpPost] 
     public JsonResult Cancel(Guid Id, string cancelReason) 
     { 
      //do something 
     } 

Js weitergeben müssen:

CancelProgram = function (Id) { 
//this is basically the value from a select tag placed on the form    
var reason = $("#CancelReasons").val(); 
      alert(reason); 

      Origin.ajax({ 
       url: '/ZYX/Cancel?Id=' + Id, 
       type: 'POST', 
       dataType: 'json', 
       data: { cancelReason: reason }, 
       success: function (data) { 
        alert('success!'); 
       } 
      }); 
     }; 
    }); 

Der Wert von cancelReason in der Aktion-Methode ist immer null . Irgendwelche Hinweise darauf, warum das nicht funktioniert?

+0

Was ist 'Origin.ajax'? Ich sehe, dass Ihre Frage mit "jquery" markiert ist, aber mir ist kein "Origin" -Objekt bekannt. Ist es etwas nach Maß? Oder ein Framework von Dritten oder etwas? –

+0

Es ist ein maßgeschneidertes Objekt, aber verhält sich genau wie jQuery – GoldenUser

+0

Ich weiß nicht, ob es sich wie jQuery verhält. Denn wenn es sich wie jQuery verhalten würde, hätte es funktioniert. Wenn Sie 'data: {id: '24fe0c97-c227-4312-91fc-6e651df8b64f', cancelReason: 'irgendeinen Grund'} verwenden, sollten beide Werte gesendet werden. Versuchen Sie, sie hart zu codieren, wie ich gezeigt habe, um sicherzustellen, dass es keine anderen Nebenwirkungen gibt. Verwenden Sie auch ein Javascript-Debugger-Tool wie FireBug. Es ermöglicht Ihnen, die genauen Anfragen/Antworten zu analysieren, die gesendet werden. Sie können sehen, ob die AJAX-Anfrage gültig ist oder nicht. –

Antwort

4

Es muss etwas falsch mit einem anderen Teil des Codes sein. Ich würde zunächst einen normalen AJAX-Request sendet, indem die Werte zu und sicherzustellen, dass sie richtig gesendet werden:

$.ajax({ 
    url: '/ZYX/Cancel', 
    type: 'POST', 
    data: { 
     id: '24fe0c97-c227-4312-91fc-6e651df8b64f', 
     cancelReason: 'some reason' 
    }, 
    success: function (data) { 
     alert('success!'); 
    } 
}); 

Sobald Sie sicher, dass diese einfache Beispiel Arbeiten beginnen, es dynamischere von Variablen. Auf diese Weise können Sie eingrenzen und den Ursprung Ihres Problems finden. Auch würde ich Ihnen sehr empfehlen, ein JavaScript-Debugging-Tool wie FireBug zu verwenden. Es ermöglicht Ihnen, in der Konsole zu sehen, ob Sie JavaScript-Fehler sowie viele andere nützliche Informationen wie die genauen Anfragen/Antworten gesendet haben.

Im Falle einer erfolgreichen AJAX-Request hier, was Sie in der Registerkarte Netzwerk von FireBug sehen sollte:

Accept:    */* 
Accept-Encoding: gzip, deflate 
Accept-Language: en-us,en;q=0.5 
Connection:   keep-alive 
Content-Length:  64 
Content-Type:  application/x-www-form-urlencoded; charset=UTF-8 
User-Agent:   Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0) Gecko/20100101 Firefox/10.0 
X-Requested-With: XMLHttpRequest 

id=24fe0c97-c227-4312-91fc-6e651df8b64f&cancelReason=some+reason 

Beachten Sie, wie sowohl die id und die cancelReason Parameter werden gesendet mit application/x-www-form-urlencoded.

Sie sollten wirklich lernen, diese Art von Problemen zu debuggen und die Möglichkeit, sie zu debuggen, ist mit den richtigen Tools.

+0

Ok. Also musste ich sowohl ID als auch cancelReason in den "data" Teil verschieben und es fing an zu arbeiten. Ich hatte den Eindruck, dass ich mit den "Daten" einen zusätzlichen Wert übergeben kann, ohne den Aufruf an den Controller zu ändern. – GoldenUser

1

Was

  url: '/ZYX/Cancel', 
      type: 'POST', 
      dataType: 'json', 
      data: { Id: Id, cancelReason: reason }, 
      success: function (data) { 
       alert('success!'); 
      } 
+0

gleiche Sache. ID erhält einen Wert, aber cancelReason nicht. – GoldenUser

0

Sie müssen die Route Ihrer angegebenen zur Verfügung zu stellen und das könnte helfen, ein wenig besser zu beantworten, jedoch sollte dies jetzt arbeiten:

url: '/ZYX/Cancel?Id=' + Id + '&cancelReason=' + reason, 

Und geben sie nicht Daten überhaupt. Wenn dies nicht funktioniert, würde ich Fiddler oder ein anderes Add-On oder Debugger für Netzwerk-Watcher verwenden, um zu überprüfen, ob der Grund ein gültiger Wert ist.

+0

Ist es möglich, die aktuelle Route nicht zu ändern, sondern die Variable und die zusätzliche Variable an die Steuerung zu übergeben, indem der Teil 'data' von jQuery verwendet wird? – GoldenUser

+0

@GoldenUser AFAIK, entweder muss eine Route angegeben sein, oder Sie müssen alles als Abfrageparameter übergeben. –

-2

Versuchen Sie, eine Route in der Datei Global.asax, so etwas wie die Einrichtung:

routes.MapRoute(
      "Cancel", // Route name 
      "{controller}/{action}/{id}/{cancelReason}", // URL with parameters 
      new { controller = "YourController", action = "Cancel", id = UrlParameter.Optional, cancelReason = UrlParameter.Optional } // Parameter defaults 
     ); 
+0

Ist es möglich, die aktuelle Route nicht zu ändern, sondern die Variable und die zusätzliche Variable an die Steuerung zu übergeben, indem der Teil 'data' von jQuery verwendet wird? – GoldenUser