2009-08-24 5 views
0

EDIT: Ich habe längst über VS2008 bewegt, und ich hatte keine Probleme mit der Rückgabe von JSON-Ergebnissen mit MVC 3+. Ich möchte diese Frage als obsolet oder etwas in diesem Sinne markieren. Vielleicht wird jemand in diesem und den gegebenen Antworten noch einen Wert finden, aber ich kann sie nicht als "korrekt" bezeichnen, da ich keine Möglichkeit habe, sie zu testen.Wie kann ich JSONResult zurückgeben, ohne dass der Browser dazu auffordert, die Datei zu speichern?

Ich bin neu in MVC und versuche, eine einfache Website zu arbeiten. Ich beginne mich zu fragen, ob es das wirklich wert ist ... Ich hätte diese Seite schon zwei oder drei Mal mit "old-school" ASP.Net laufen lassen können ... aber das ist nebensächlich ;-)

Wie kann ich meinen Controller dazu bringen, ein JSONResult zurückzugeben, ohne dass der Browser mich dazu auffordert, die Antwort als Datei zu speichern? Hier ist das JavaScript, das die Aktion aufruft:

$("select#PageId").change(function() { 
    var id = $("#PageId > option:selected").attr("value"); 
    $.getJSON('FindCategories/', { PageId: id }, 
     function(data) { 
      if (data.length > 0) { 
       var options = ''; 
       for (c in data) { 
        var cat = data[c]; 
        options += "<option value='" + cat.CategoryId + "'>" + cat.CategoryName + "</option>"; 
       } 
       $("#CategoryId").removeAttr('disabled').html(options); 
      } else { 
       $("#CategoryId").attr('disabled', true).html(''); 
      } 
    }); 
}); 

Hier ist mein Controller-Aktion:

Function GetCategoriesByPage(ByVal PageId As Integer) As JsonResult 

    Dim categories As List(Of Models.WebCategoryLite) = _service.ListCategoriesByPageId(PageId) 

    Dim res As New JsonResult 
    res.Data = categories 
    Return res 

End Function 

Fiddler zeigt mir, dass die JSON an den Browser zurückgegeben wird:

HTTP/1.1 200 OK 
Server: ASP.NET Development Server/9.0.0.0 
Date: Mon, 24 Aug 2009 19:43:53 GMT 
X-AspNet-Version: 2.0.50727 
X-AspNetMvc-Version: 1.0 
Cache-Control: private 
Content-Type: application/json; charset=utf-8 
Content-Length: 246 
Connection: Close 

[{"CategoryID":1,"CategoryName":"Sample Category"},{"CategoryID":2,"CategoryName":"Another Sample"},{"CategoryID":3,"CategoryName":"Yet Another Sample"}] 

Nein Egal, mit welchem ​​Browser ich das versuche, ich bekomme eine "Datei speichern unter" -Prompt.

Ich führe dies aus der Visual Studio 2008 IDE heraus. Was muss ich tun, damit dies funktioniert, sowohl in der IDE als auch in IIS?

Vielen Dank im Voraus!

Antwort

3

Gerade gesetzt Content-type auf "text/plain":

Function GetCategoriesByPage(ByVal PageId As Integer) As JsonResult 

    Dim categories As List(Of Models.WebCategoryLite) = _service.ListCategoriesByPageId(PageId) 

    Dim res As New JsonResult 
    res.Data = categories 
    res.ContentType = "text/plain" 
    Return res 

End Function 

Wenn es nicht funktioniert, können Sie JsonResult Unterklasse und ExecuteResult Methode außer Kraft setzen:

public class myOwnJsonResul: JsonResult 
{ 
    public override void ExecuteResult(ControllerContext context) 
    { 
     base.ExecuteResult(context); 
     context.HttpContext.Response.ContentType = "text/plain"; 
    } 
} 
+0

* I zweites Beispiel in C# geschrieben, weil ich die VB syntaxe – Cleiton

+0

Nun kann mich nicht erinnern, habe ich versucht, HttpContext.Response.ContentType = "text/plain" und Fiddler zeigte noch den Inhaltstyp als "Anwendung/JSON" Dann setze ich die "ContentType" -Eigenschaft des JSONResult-Objekts auf "text/plain", und meine ursprüngliche aspx-Seite wurde durch das JSON-Ergebnis ersetzt, das auf der Browserseite als einfacher Text angezeigt wird. – camainc

+0

Dieses zweite Ergebnis ist das korrekte Verhalten. –

1

Gut gemacht.

var s = new JsonResult(); 
s.ContentType = "text/plain"; 
s.JsonRequestBehavior = JsonRequestBehavior.AllowGet; 
s.Data = AreaServiceClient.GetCityList(id);    
return s; 
Verwandte Themen