Khi bạn làm return Json(...)
bạn đang đặc biệt nói MVC không sử dụng một cái nhìn, và để phục vụ dữ liệu JSON serialized. Trình duyệt của bạn mở hộp thoại tải xuống vì nó không biết phải làm gì với dữ liệu này.
Nếu bạn thay vì muốn quay trở lại một cái nhìn, chỉ cần làm return View(...)
như bạn thường:
var dictionary = listLocation.ToDictionary(x => x.label, x => x.value);
return View(new { Values = listLocation });
Sau đó, theo quan điểm của bạn, chỉ cần mã hóa dữ liệu của bạn như JSON và gán nó vào một biến JavaScript:
<script>
var values = @Html.Raw(Json.Encode(Model.Values));
</script>
EDIT
Đây là mẫu hoàn chỉnh hơn một chút. Vì tôi không có đủ ngữ cảnh từ bạn, mẫu này sẽ giả định một bộ điều khiển Foo
, một hành động Bar
và một kiểu xem FooBarModel
. Ngoài ra, danh sách các địa điểm là hardcoded:
Controller/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>
Bằng giao diện của thông báo lỗi, có vẻ như bạn đang trộn các loại không tương thích (tức là Ported_LI.Models.Location
và MyApp.Models.Location
) vì vậy, để tóm tắt lại, hãy đảm bảo loại được gửi từ phía hành động của bộ điều khiển khớp với những gì được nhận từ chế độ xem. Đối với mẫu này đặc biệt, new FooBarModel
trong bộ điều khiển phù hợp với @model MyApp.Models.FooBarModel
trong chế độ xem.
Hi daniel, tôi nhận được lỗi sau trong trang xem của tôi, khi tôi sử dụng mã ở trên."Mục mẫu được chuyển vào từ điển là loại '<> f__AnonymousType3'1 [System.Collections.Generic.List'1 [Ported_LI.Models.Location]]', nhưng từ điển này yêu cầu một mục kiểu của kiểu 'MyApp.Models .Vị trí'". Vui lòng trợ giúp thêm. – Purushoth
Chính xác những gì tôi đang tìm kiếm. Có vẻ kỳ quặc rằng đó là chế độ xem mã hóa Json. Tôi nghĩ Bộ điều khiển sẽ/nên có chức năng này. Ví dụ của bạn cực kỳ hữu ích. – IAbstract
@IAbstract Nếu bạn thực sự muốn, bạn có thể đặt 'Json.Encode' trong bộ điều khiển. Cá nhân tôi sẽ không làm điều đó, bởi vì (1) bạn điều khiển logic vẫn đơn giản; (2) biểu diễn kinh điển cho phép bạn linh hoạt hơn. Ví dụ: bạn có thể lặp lại bộ sưu tập, thực hiện điều kiện (ví dụ: 'if (Model.Locations.Any()) {...}'), v.v.); nếu mã hóa trong bộ điều khiển của bạn, quan điểm của bạn về cơ bản bị mắc kẹt với một chuỗi; và (3) Tôi không nghĩ rằng bộ điều khiển phải chịu trách nhiệm về những gì cơ bản là một mối quan tâm trình bày (tức là nó là JavaScript trong quan điểm của bạn những gì dictates sự cần thiết cho JSON). Chúc mừng. –