2013-03-04 39 views
34

Tôi đang làm một ứng dụng MVC mà tôi cần truyền đối tượng json từ bộ điều khiển để xem.Cách trả về đối tượng Json từ bộ điều khiển MVC để xem

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

Mã trên tôi đang sử dụng trong trình điều khiển của mình, khi tôi mở trang xem nó mở hộp thoại tải xuống khi tôi cần định dạng.

Bây giờ tôi muốn trả lại trang xem của mình cũng muốn truy cập đối tượng json trong trang xem. Làm thế nào tôi có thể làm điều đó.

Trả lời

54

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.Locatio‌​nMyApp.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.

+0

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

+2

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

+0

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

3

Bạn có thể sử dụng AJAX để gọi hành động của bộ điều khiển này. Ví dụ, nếu bạn đang sử dụng jQuery bạn có thể sử dụng phương pháp $.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, tôi đã thử phương pháp của bạn vẫn mang lại cho đối thoại tải khi truy cập vào trang xem. – 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

Vui lòng bao gồm giải thích về mã của bạn và cách nó giải đáp câu hỏi. Nếu bạn nhận được một đoạn mã như một câu trả lời, bạn có thể không biết phải làm gì với nó. Câu trả lời nên cung cấp cho OP và hướng dẫn khách truy cập trong tương lai về cách gỡ lỗi và khắc phục sự cố của họ. Chỉ ra, ý tưởng đằng sau mã của bạn là gì, giúp hiểu rõ vấn đề và áp dụng hoặc sửa đổi giải pháp của bạn. – Palec

+0

@Palec Trong khi tôi đồng ý với bạn trong phần giải thích của bạn và tin rằng điều đó sẽ làm cho đoạn trích trở thành câu trả lời hay hơn, trong thực tế, người trả lời 10K + và 100K + cung cấp đoạn trích mọi lúc và được chấp nhận mà không có câu hỏi. Do đó, câu trả lời này là hợp pháp khi trang web đứng ngay bây giờ trừ khi những thay đổi trong triết lý quản lý được thực hiện. – demongolem

+0

@demongolem Tôi đã gặp điều này từ hàng đợi đánh giá VLQ, đăng bình luận và chỉnh sửa; không đề nghị xóa. Tôi thấy [chúng tôi đồng ý] (https://stackoverflow.com/review/low-quality-posts/5258279) trên thực tế, các câu trả lời đoạn mã là OK. Tôi chỉ muốn hướng dẫn cách làm cho chúng tốt hơn. – 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 Trả về dữ liệu Html. làm thế nào để kết xuất json này trong xem. –

Các vấn đề liên quan