2010-12-27 12 views
3

Ich versuche Ajax.BeginForm() zu verwenden, um ein Json-Ergebnis von meinem Controller (ich verwende MVC3) POST. Wenn das Json Ergebnis genannt wird, soll es zu einer Javascript-Funktion gesendet werden und das Objekt extrahiertASP.NET MVC3 - Fehler mit Javascript

var myObject = content.get_response().get_object(); 

mit aber es nur ein wirft „Microsoft JScript-Laufzeitfehler: Objekt unterstützt diese Eigenschaft oder diese Methode nicht unterstützt“, wenn sie versuchen, Rufen Sie den Ajax POST auf.

Mein Code:

Controller:

[HttpPost] 
public ActionResult Index(string message) 
{ 
    return Json(new { Success = true, Message = message }); 
} 

Ausblick:

<!DOCTYPE html> 

<html> 
<head> 
    <script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript"></script> 

    <script type="text/javascript"> 
     function JsonAdd_OnComplete(mycontext) { 
      var myObject = mycontext.get_response().get_object(); 
      alert(mycontext.Message); 
     } 
    </script> 
</head> 

<body> 
    <div> 
     @using(Ajax.BeginForm("Index", "Home", new AjaxOptions() { HttpMethod = "POST", OnComplete = "JsonAdd_OnComplete" })) 
     { 
      @Html.TextBox("message") 

      <input type="submit" value="SUBMIT" /> 

     } 
    </div> 
</body> 
</html> 

Das Merkwürdige ist, dass das genau denselben Code in MVC2 funktioniert - Ist das ein Bug, oder Habe ich etwas vergessen?

Vielen Dank im Voraus.

+0

ich ASP weiß nicht, aber Bist du sicher, dass 'OnComplete = "JsonAdd_OnComplete" 'nicht vielleicht' OnComplete = JsonAdd_OnComplete 'sein sollte ?? Mit anderen Worten, zitieren Sie nicht den Funktionsnamen ... – Pointy

+0

Ja, laut der Dokumentation sollte es "FunctionName" sein. - Ich habe OnComplete = JsonAdd_OnComplete auch versucht, aber es gibt nur einen Kompilierfehler zurück, weil es kein String ist. – ebb

Antwort

3

AFAIK in ASP.NET MVC 3 RC MS AJAX wurde zugunsten von jQuery veraltet, die von allen Ajax.* Helper-Methoden verwendet wird. Javascript ist auch unobtrusive geworden. Das bedeutet, dass Sie nicht mehr .get_response().get_object() nennen, sondern einfach:

function JsonAdd_OnComplete(myObject) { 
    // here myObject is already the JSON object 
    // as returned by the controller action 
    alert(myObject.Message); 
} 
+0

Eigentlich habe ich das geschossen, als ich den Code in meine Antwort geschrieben habe und es scheint nicht so in der OnComplete-Methode zu funktionieren ... vorausgesetzt, Sie verwenden die alten MicrosoftAjax-Methoden :) – Buildstarted

1

Haben Sie sich die OnSuccess Methode angesehen? Wenn das Verfahren die ihm übergebene Objekt aufgerufen wird, ist ein JSON-Objekt auf einem JsonResult basiert, so können Sie dies tun ...

<script type="text/javascript"> 
    function JsonAdd_OnSuccess(mycontext) { 
     alert(mycontext.Message); 
    } 
</script> 

@using(Ajax.BeginForm("Index", "Home", 
    new AjaxOptions() { 
     HttpMethod = "POST", 
     OnSuccess = "JsonAdd_OnSuccess" })) { 

    @Html.TextBox("message") 

    <input type="submit" value="SUBMIT" /> 

} 

Zusätzlich ein Objekt der OnComplete Methode gibt, die die folgenden Eigenschaften enthält

context.responseText 
context.responseBody 
context.responseXml 

Sie müssen eval() der ResponseText, um den Text in JSON obwohl zu konvertieren.

+0

Ich war soo hoffe, dass Ihre Antwort funktionieren würde, aber ich bekomme den folgenden Fehler, wenn ich die 'eval()': 'Uncaught SyntaxError: Unerwartete Token:' –

+0

@SerjSagan klingt wie Ihre JSON möglicherweise ungültig sein. – Buildstarted

+0

Der JSON wird vom MVC-Controller 'JsonResult' mit' return Json zurückgegeben (new {result = true, inputs = mylist.ToList()}); 'Siehe meine Antwort, um zu sehen, wie ich es zum Laufen brachte ... –

0

wenn Sie die Methode von BuildStarted bereitgestellt verwenden, ist hier, wie die eval zu strukturieren:

var json = eval("(" + context.responseText + ")"); 
Verwandte Themen