Когда вы 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.Location
и MyApp.Models.Location
), поэтому, чтобы повторить, убедитесь, что тип, отправленный со стороны действия контроллера, соответствует тому, что получено от представления. Для этого образца, в частности, new FooBarModel
в контроллере соответствует @model MyApp.Models.FooBarModel
на вид.
Привет, даниэль, я получил следующую ошибку на моей странице просмотра, когда я использовал приведенный выше код.«Элемент модели, переданный в словарь, имеет тип« <> f__AnonymousType3'1 [System.Collections.Generic.List'1 [Ported_LI.Models.Location]] », но для этого словаря требуется элемент модели типа« MyApp.Models » .Место нахождения'". PLease поможет дальше. – Purushoth
Именно то, что я искал. Кажется странным, что это представление, которое кодирует Json. Я бы подумал, что контроллер должен/должен иметь эту функцию. Ваш пример чрезвычайно полезен. – IAbstract
@IAbstract Если вы действительно хотели, вы могли бы поставить 'Json.Encode' в контроллер. Лично я бы этого не делал, потому что (1) логика контроллера остается простой; (2) каноническое представление дает вам большую гибкость. Например, вы можете выполнять итерацию коллекции, выполнять условные обозначения (например, if (Model.Locations.Any()) {...} ') и т. Д.); если кодировать в контроллере, ваш взгляд в основном застрял со строкой; и (3) я не думаю, что диспетчер должен нести ответственность за то, что в основном представляет собой интерес к презентации (т. е. это, по вашему мнению, JavaScript, что диктует необходимость JSON). Приветствия. –