2013-03-04 21 views
34

Robię aplikacji MVC, gdzie muszę przekazać obiekt json z kontrolera, aby wyświetlić.Jak przywrócić obiekt Json z kontrolera MVC, aby wyświetlić

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

Powyższy kod używam w moim kontrolera, teraz gdy wdrożyć strona widok jego otwarcie okna pobierania w przeglądarce, gdy otwarty plik daje mi json obiektu jak i potrzebnego formatu.

Teraz chcę zwrócić moją stronę widoku również chcą uzyskać dostęp do obiektu json na stronie widoku. jak mogę to zrobić.

Odpowiedz

54

Kiedy robisz return Json(...) jesteś konkretnie mówiąc MVC nie używać widok i służyć odcinkach danych JSON. Twoja przeglądarka otwiera okno dialogowe pobierania, ponieważ nie wie, co zrobić z tymi danymi.

Jeśli zamiast tego chcesz powrócić do widoku, po prostu zrób return View(...) jak ty normalnie:

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

Następnie w widoku, koduj swoje dane jako JSON i przypisać ją do zmiennej javascript:

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

EDIT

Oto nieco bardziej kompletna próbka. Ponieważ nie mam wystarczającego kontekstu od ciebie, ta próbka przyjmie kontroler Foo, działanie Bar i model widoku . Dodatkowo, lista miejsc jest sztywno:

controllers/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); 
    } 
} 

models/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> 

Wygląd komunikatów o błędach wygląda na to, że mieszasz niekompatybilne typy (np. Ported_LI.Models.Locatio‌​n i MyApp.Models.Location), więc, aby podsumować, upewnij się, że typ wysyłany ze strony akcji kontrolera jest zgodny z tym, co jest odbierane z widoku. W przypadku tej próbki w szczególności new FooBarModel w kontrolerze odpowiada @model MyApp.Models.FooBarModel w widoku.

+0

Witam Daniel, Mam następujący błąd na mojej stronie widoku, kiedy użyłem powyższego kodu."Element modelu przekazany do słownika jest typu" <> f__AnonymousType3'1 [System.Collections.Generic.List'1 [Ported_LI.Models.Location]] ', ale ten słownik wymaga elementu modelu typu "MyApp.Models" .Lokalizacja'". Pośpiesz dalej. – Purushoth

+2

Dokładnie to, czego szukałem. Wydaje się dziwne, że to jest kodowanie Jsona. Myślę, że kontroler powinien/powinien mieć tę funkcję. Twój przykład jest niezwykle przydatny. – IAbstract

+0

@Abstract Jeśli naprawdę chciałeś, możesz umieścić 'Json.Encode' w kontrolerze. Osobiście nie zrobiłbym tego, ponieważ (1) logika kontrolera pozostaje prosta; (2) reprezentacja kanoniczna daje większą elastyczność. Na przykład można iterować kolekcję, czy warunkowe (tj. 'If (Model.Locations.Any()) {...}') itp.); jeśli kodujesz w kontrolerze, twój widok jest w zasadzie zablokowany za pomocą łańcucha; i (3) Nie sądzę, że kontroler powinien być odpowiedzialny za to, co zasadniczo jest problemem związanym z prezentacją (tj. jest to JavaScript w twoim odczuciu, co dyktuje potrzebę JSON). Twoje zdrowie. –

3

Możesz użyć AJAX, aby wywołać tę akcję kontrolera. Na przykład, jeśli używasz jQuery można użyć metody $.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

Hi Darin, próbowałem metoda wciąż daje pobierania dialogu przy dostępie do widoku strony. – 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

Proszę podać wyjaśnienie, co robi twój kod i jak odpowiada na pytanie. Jeśli otrzymasz fragment kodu jako odpowiedź, możesz nie wiedzieć, co z nim zrobić. Odpowiedź powinna dać OP i przyszłym odwiedzającym wskazówki dotyczące debugowania i naprawiania ich problemów. Wskazanie, co kryje się za twoim kodem, bardzo pomaga w zrozumieniu problemu i zastosowaniu lub zmodyfikowaniu twojego rozwiązania. – Palec

+0

@Palec Podczas gdy zgadzam się z tobą w twoich wyjaśnieniach i wierzę, że to sprawiłoby, że ten fragment byłby lepszą odpowiedzią, w praktyce 10K + i 100K + odpowiadający dają fragmenty cały czas i to jest akceptowane bez pytania. Ta odpowiedź jest zatem uzasadniona, ponieważ strona stoi teraz, chyba że wprowadzono zmiany w filozofii rządzącej. – demongolem

+0

@demongolem Spotkałem to z kolejki przeglądu VLQ, opublikowałem komentarz i edytowałem; nie sugerował usunięcia. Widzę [zgodziliśmy się] (https://stackoverflow.com/review/low-quality-posts/5258279) na fakt, że odpowiedzi na fragmenty kodu są w porządku. Po prostu lubię udzielać wskazówek, jak je ulepszyć. – 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 Zwraca dane html. sposób renderowania tego wyniku json w widoku. –

Powiązane problemy