Как вернуть JSONResult без запроса браузера сохранить файл? - PullRequest
0 голосов
/ 25 августа 2009

РЕДАКТИРОВАТЬ: я давно вышел за пределы VS2008, и у меня не было проблем с возвратом результатов JSON с использованием MVC 3+. Я хотел бы отметить этот вопрос как устаревший или что-то в этом роде. Возможно, кто-то все равно найдет в этом ценность и ответы, но я не могу пометить их как «правильные», поскольку у меня нет возможности их проверить.

Я новичок в 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

Fiddler показывает мне, что 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"}]

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

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

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 25 августа 2009

Просто установите Content-type на "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

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

public class myOwnJsonResul: JsonResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        base.ExecuteResult(context);
        context.HttpContext.Response.ContentType = "text/plain";
    }
}
1 голос
/ 11 апреля 2012

Хорошая работа.

var s = new JsonResult();
s.ContentType = "text/plain";
s.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
s.Data = AreaServiceClient.GetCityList(id);            
return s;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...