2013-03-04 4 views
34

Я делаю приложение MVC, где мне нужно передать объект json из контроллера для просмотра.Как вернуть объект Json из MVC-контроллера для просмотра

var dictionary = listLocation.ToDictionary(x => x.label, x => x.value); 
return Json(new { values = listLocation}, JsonRequestBehavior.AllowGet); 

Приведенный выше код, я использую в мой контроллер, теперь, когда я развернуть на странице просмотра его открытия диалог загрузки в браузере, при открытии файла он дает мне JSon объект как я необходимый формат.

Теперь я хочу вернуть свою страницу просмотра, также хочу получить доступ к объекту json на странице просмотра. Как мне это сделать.

ответ

54

Когда вы return Json(...) вы конкретно говорить MVC не использовать вид и служить сериализованных данных в формате JSON. Ваш браузер открывает диалоговое окно загрузки, потому что он не знает, что делать с этими данными.

Если вместо этого вы хотите возвратить представление, просто сделать return View(...), как вы обычно бы:

var dictionary = listLocation.ToDictionary(x => x.label, x => x.value); 
return View(new { Values = listLocation }); 

Затем на ваш взгляд, просто кодировать данные в формате JSON и присвоить его переменной JavaScript:

<script> 
    var values = @Html.Raw(Json.Encode(Model.Values)); 
</script> 

EDIT

Вот немного более полный образец. Поскольку у меня нет достаточного контекста от вас, в этом примере будет использоваться контроллер Foo, действие Bar и модель вида FooBarModel. Кроме того, список локаций зашиты:

Контроллеры/FooController.cs

public class FooController : Controller 
{ 
    public ActionResult Bar() 
    { 
     var locations = new[] 
     { 
      new SelectListItem { Value = "US", Text = "United States" }, 
      new SelectListItem { Value = "CA", Text = "Canada" }, 
      new SelectListItem { Value = "MX", Text = "Mexico" }, 
     }; 

     var model = new FooBarModel 
     { 
      Locations = locations, 
     }; 

     return View(model); 
    } 
} 

Модели/FooBarModel.cs

public class FooBarModel 
{ 
    public IEnumerable<SelectListItem> Locations { get; set; } 
} 

Views/Foo/Bar.cshtml

@model MyApp.Models.FooBarModel 

<script> 
    var locations = @Html.Raw(Json.Encode(Model.Locations)); 
</script> 

По внешнему виду вашего сообщения об ошибке кажется, что вы смешиваете несовместимые типы (т. Ported_LI.Models.Locatio‌​n и MyApp.Models.Location), поэтому, чтобы повторить, убедитесь, что тип, отправленный со стороны действия контроллера, соответствует тому, что получено от представления. Для этого образца, в частности, new FooBarModel в контроллере соответствует @model MyApp.Models.FooBarModel на вид.

+0

Привет, даниэль, я получил следующую ошибку на моей странице просмотра, когда я использовал приведенный выше код.«Элемент модели, переданный в словарь, имеет тип« <> f__AnonymousType3'1 [System.Collections.Generic.List'1 [Ported_LI.Models.Location]] », но для этого словаря требуется элемент модели типа« MyApp.Models » .Место нахождения'". PLease поможет дальше. – Purushoth

+2

Именно то, что я искал. Кажется странным, что это представление, которое кодирует Json. Я бы подумал, что контроллер должен/должен иметь эту функцию. Ваш пример чрезвычайно полезен. – IAbstract

+0

@IAbstract Если вы действительно хотели, вы могли бы поставить 'Json.Encode' в контроллер. Лично я бы этого не делал, потому что (1) логика контроллера остается простой; (2) каноническое представление дает вам большую гибкость. Например, вы можете выполнять итерацию коллекции, выполнять условные обозначения (например, if (Model.Locations.Any()) {...} ') и т. Д.); если кодировать в контроллере, ваш взгляд в основном застрял со строкой; и (3) я не думаю, что диспетчер должен нести ответственность за то, что в основном представляет собой интерес к презентации (т. е. это, по вашему мнению, JavaScript, что диктует необходимость JSON). Приветствия. –

3

Вы можете использовать AJAX для вызова этого действия контроллера. Например, если вы используете JQuery вы можете использовать $.ajax() метод:

<script type="text/javascript"> 
    $.ajax({ 
     url: '@Url.Action("NameOfYourAction")', 
     type: 'GET', 
     cache: false, 
     success: function(result) { 
      // you could use the result.values dictionary here 
     } 
    }); 
</script> 
+0

Привет Дарин, я попробовал ваш метод все еще дает скачать диалог при доступе просмотра страницы. – Purushoth

-2
$.ajax({ 
    dataType: "json", 
    type: "POST", 
    url: "/Home/AutocompleteID", 
    data: data, 
    success: function (data) { 
     $('#search').html(''); 
     $('#search').append(data[0].Scheme_Code); 
     $('#search').append(data[0].Scheme_Name); 
    } 
}); 
+2

Просьба включить объяснение того, что делает ваш код и как он отвечает на вопрос. Если вы получите фрагмент кода в качестве ответа, вы можете не знать, что с ним делать. Ответ должен дать руководству OP и будущих посетителей о том, как отлаживать и исправлять свои проблемы. Указывая, что представляет собой идея вашего кода, очень помогает в понимании проблемы и применении или изменении вашего решения. – Palec

+0

@Palec Пока я согласен с вами в вашем объяснении и считаю, что это сделает отрывок лучшим ответом, на практике 10K + и 100K + ответчики все время дают отрывки, и это принято без вопросов. Поэтому этот ответ является законным, поскольку сайт стоит сейчас, если не будут сделаны изменения в философии управления. – demongolem

+0

@demongolem Я встретил это из очереди просмотра VLQ, разместил комментарий и отредактировал; не предлагал удалить. Я вижу [мы договорились] (https://stackoverflow.com/review/low-quality-posts/5258279) о том, что ответы на код-фрагмент в порядке. Я просто хочу дать указания о том, как сделать их лучше. – Palec

0
<script type="text/javascript"> 
jQuery(function() { 
    var container = jQuery("\#content"); 
    jQuery(container) 
    .kendoGrid({ 
     selectable: "single row", 
     dataSource: new kendo.data.DataSource({ 
      transport: { 
       read: { 
        url: "@Url.Action("GetMsgDetails", "OutMessage")" + "?msgId=" + msgId, 
        dataType: "json", 
       }, 
      }, 
      batch: true, 
     }), 
     editable: "popup", 
     columns: [ 
      { field: "Id", title: "Id", width: 250, hidden: true }, 
      { field: "Data", title: "Message Body", width: 100 }, 
      { field: "mobile", title: "Mobile Number", width: 100 }, 
     ] 
    }); 
}); 

+0

Json Return Html Data. как сделать этот результат json в представлении. –

Смежные вопросы