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.Location
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.
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
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
@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. –