そうするときは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>
編集
これがもう少し完全なサンプルです。十分なコンテキストがないため、このサンプルでは、コントローラーFoo
、アクションBar
、およびビューモデルを想定していますFooBarModel
。さらに、場所のリストはハードコーディングされています。
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>
Ported_LI.Models.Location
エラーメッセージの外観から、互換性のないタイプ(つまり、と)が混在しているように見えるMyApp.Models.Location
ので、要約すると、コントローラーアクション側から送信されたタイプがビューから受信されたものと一致することを確認してください。特にこのサンプルの場合new FooBarModel
、コントローラーではビューで一致@model MyApp.Models.FooBarModel
します。