2009-08-24 2 views
0

EDIT: Я давно уже вышел за рамки VS2008, и у меня не было проблем с возвратом результатов JSON с использованием MVC 3+. Я хотел бы отметить этот вопрос как устаревший или что-то в этом роде. Возможно, кто-то все равно найдет в этом смысл и ответы, но я не могу отметить их как «правильные», так как у меня нет возможности их проверить.Как вернуть JSONResult без браузера, предлагающего сохранить файл?

Я новичок в MVC, и я стараюсь сделать простой сайт. Я начинаю задаваться вопросом, действительно ли это стоит ... Я мог бы запустить этот сайт с «старой школьной» ASP.Net уже два или три раза ... но это не относится к делу ;-)

Как я могу заставить мой контроллер вернуть JSONResult без браузера, предлагая мне сохранить ответ в виде файла? Вот JavaScript, который вызывает действие:

$("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(''); 
      } 
    }); 
}); 

Вот мой контроллер действия:

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 

Скрипач показывает мне, что JSON возвращается в браузер:

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"}] 

Нет вопрос, в какой браузер я пытаюсь это сделать, я получаю приглашение «сохранить файл как».

Я запускаю это изнутри Visual Studio 2008 IDE. Что мне нужно сделать, чтобы выполнить эту работу, как в среде IDE, так и в IIS?

Заранее благодарен!

ответ

3

Просто установите Content-типа для "текст/обычный":

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 

Если он не работает, вы можете создать подкласс JsonResult и переопределить ExecuteResult метод:

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

* Я написал второй пример в C#, потому что я не помню В. Б. syntaxe – Cleiton

+0

Ну, я попытался HttpContext.Response.ContentType = «текст/обычный» и Скрипач еще показал тип контента как "Применение/JSON." Затем я установил свойство «ContentType» объекта JSONResult в «text/plain», и моя исходная страница aspx была заменена результатом JSON, отображаемым на странице браузера в виде обычного текста. – camainc

+0

, второй результат - правильное поведение. –

1

Отличная работа.

var s = new JsonResult(); 
s.ContentType = "text/plain"; 
s.JsonRequestBehavior = JsonRequestBehavior.AllowGet; 
s.Data = AreaServiceClient.GetCityList(id);    
return s; 
Смежные вопросы