2008-10-22 40 views

Trả lời

443

Trong phương thức hành động của bạn, trả về Json (đối tượng) để trả về JSON cho trang của bạn.

public ActionResult SomeActionMethod() { 
    return Json(new {foo="bar", baz="Blech"}); 
} 

Sau đó, chỉ cần gọi phương thức hành động bằng Ajax. Bạn có thể sử dụng một trong các phương thức trợ giúp từ ViewPage như

<%= Ajax.ActionLink("SomeActionMethod", new AjaxOptions {OnSuccess="somemethod"}) %> 

SomeMethod là phương thức javascript để đánh giá đối tượng Json được trả về.

Nếu bạn muốn trả về một chuỗi đơn giản, bạn chỉ có thể sử dụng ContentResult:

public ActionResult SomeActionMethod() { 
    return Content("hello world!"); 
} 

ContentResult theo mặc định trả về một text/plain như contentType của nó.
Đây là overloadable vì vậy bạn cũng có thể làm:

return Content("<xml>This is poorly formatted xml.</xml>", "text/xml"); 
+4

xin lỗi phil! điều này không thực sự trả lời câu hỏi hiện nó? của nó chắc chắn hữu ích nhưng như brad nói rằng bạn cần phải tìm hiểu bằng cách nào đó những gì họ đang yêu cầu và trả lại kết quả cho phù hợp. –

+0

xem phần nào của tôi có liên quan (cũng là một trong đó dẫn tôi ở đây) câu hỏi tại http://stackoverflow.com/questions/482363/should-my-mvc-controller-really-know-about-json –

+9

nếu bạn tìm thấy câu trả lời, liên kết nó trong chính câu hỏi đó. Ngoài ra tôi không nghĩ rằng việc kiểm tra này là câu trả lời là điều đúng. – Cherian

71

Một cách tốt đẹp để đối phó với JSON dữ liệu được sử dụng chức năng JQuery getJSON. Bạn có thể gọi phương pháp

public ActionResult SomeActionMethod(int id) 
{ 
    return Json(new {foo="bar", baz="Blech"}); 
} 

từ phương pháp jquery getJSON bằng cách đơn giản ...

$.getJSON("../SomeActionMethod", { id: someId }, 
    function(data) { 
     alert(data.foo); 
     alert(data.baz); 
    } 
); 
+14

Điều này không trả lời được câu hỏi nào cả. – Aaronaught

+2

@Aaronaught Trên thực tế phần đầu tiên 'return Json (new {foo =" bar ", baz =" Blech "});' hiện! – SparK

12

Để trả lời một nửa còn lại của câu hỏi, bạn có thể gọi:

return PartialView("viewname"); 

khi bạn muốn trả lại một phần HTML. Bạn sẽ phải tìm một số cách để quyết định xem yêu cầu có cần JSON hay HTML, có lẽ dựa trên một phần/tham số URL.

+2

do đó, không câu hỏi vẫn chưa được trả lời? –

+2

Điều này không trả lời được câu hỏi. – Aaronaught

+0

anh ấy đang tìm kiếm yêu cầu ajax để nhận html bằng PartialView yêu cầu làm mới trang trừ khi bạn trả lại chế độ xem từ phương thức hành động bằng cách sử dụng cuộc gọi ajax –

103

Tôi nghĩ bạn nên xem xét AcceptTypes của yêu cầu. Tôi đang sử dụng nó trong dự án hiện tại của tôi để trả về kiểu nội dung chính xác như sau.

hành động của bạn trên bộ điều khiển có thể kiểm tra nó như trên đối tượng yêu cầu

if (Request.AcceptTypes.Contains("text/html")) { 
    return View(); 
} 
else if (Request.AcceptTypes.Contains("application/json")) 
{ 
    return Json(new { id=1, value="new" }); 
} 
else if (Request.AcceptTypes.Contains("application/xml") || 
     Request.AcceptTypes.Contains("text/xml")) 
{ 
    // 
} 

Sau đó bạn có thể thực hiện aspx của nhằm phục vụ cho các trường hợp phản ứng xhtml một phần.

Sau đó, trong jQuery bạn có thể lấy nó đi qua các tham số kiểu như json:

$.get(url, null, function(data, textStatus) { 
     console.log('got %o with status %s', data, textStatus); 
     }, "json"); // or xml, html, script, json, jsonp or text 

Hope this helps James

+3

Cảm ơn James, điều đó có thể rất hữu ích cho việc tạo loại trang web và REST API sử dụng cùng một Hành động điều khiển. – NathanD

+0

Nếu tôi có nhiều phương pháp như thế này trong bộ điều khiển của mình thì có cách nào để tôi có thể làm điều này một cách tổng quát hơn không? – Seph

+0

Trong đó không gian tên là lớp Json? Phụ thuộc cho project.json là gì? Cảm ơn trước – Andrei

4

Đối với folks người đã nâng cấp lên MVC 3 đây là một cách gọn gàng Using MVC3 and Json

+1

bạn cũng có thể sử dụng kỹ thuật tương tự như bài viết này trong MVC 2 – longhairedsi

6

giải pháp thay thế với incoding framework

Hành động trở lại json

khiển

[HttpGet] 
    public ActionResult SomeActionMethod() 
    { 
     return IncJson(new SomeVm(){Id = 1,Name ="Inc"}); 
    } 

trang Razor

@using (var template = Html.Incoding().ScriptTemplate<SomeVm>("tmplId")) 
{ 
    using (var each = template.ForEach()) 
    { 
     <span> Id: @each.For(r=>r.Id) Name: @each.For(r=>r.Name)</span> 
    } 
} 

@(Html.When(JqueryBind.InitIncoding) 
    .Do() 
    .AjaxGet(Url.Action("SomeActionMethod","SomeContoller")) 
    .OnSuccess(dsl => dsl.Self().Core() 
           .Insert 
           .WithTemplate(Selector.Jquery.Id("tmplId")) 
           .Html()) 
    .AsHtmlAttributes() 
    .ToDiv()) 

Action trở html

khiển

[HttpGet] 
    public ActionResult SomeActionMethod() 
    { 
     return IncView(); 
    } 

trang Razor

@(Html.When(JqueryBind.InitIncoding) 
    .Do() 
    .AjaxGet(Url.Action("SomeActionMethod","SomeContoller")) 
    .OnSuccess(dsl => dsl.Self().Core().Insert.Html()) 
    .AsHtmlAttributes() 
    .ToDiv()) 
40

Tôi đã tìm thấy một số vấn đề khi triển khai MVC ajax GET calls with JQuery khiến tôi đau đầu để chia sẻ các giải pháp tại đây.

  1. Đảm bảo bao gồm loại dữ liệu "json" trong cuộc gọi ajax. Điều này sẽ tự động phân tích cú pháp đối tượng JSON được trả về cho bạn (do máy chủ trả về json hợp lệ).
  2. Bao gồm JsonRequestBehavior.AllowGet; mà không có MVC này đã trả lại lỗi HTTP 500 (với dataType: json được chỉ định trên máy khách).
  3. Thêm cache: false vào cuộc gọi $ .ajax, nếu không bạn cuối cùng sẽ nhận được phản hồi HTTP 304 (thay vì phản hồi HTTP 200) và máy chủ sẽ không xử lý yêu cầu của bạn.
  4. Cuối cùng, json phân biệt chữ hoa chữ thường, vì vậy vỏ của các phần tử cần khớp với phía máy chủ và phía máy khách.

mẫu JQuery:

$.ajax({ 
    type: 'get', 
    dataType: 'json', 
    cache: false, 
    url: '/MyController/MyMethod', 
    data: { keyid: 1, newval: 10 }, 
    success: function (response, textStatus, jqXHR) { 
    alert(parseInt(response.oldval) + ' changed to ' + newval);          
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
    alert('Error - ' + errorThrown); 
    } 
}); 

mẫu mã MVC:

[HttpGet] 
public ActionResult MyMethod(int keyid, int newval) 
{ 
    var oldval = 0; 

    using (var db = new MyContext()) 
    { 
    var dbRecord = db.MyTable.Where(t => t.keyid == keyid).FirstOrDefault(); 

    if (dbRecord != null) 
    { 
     oldval = dbRecord.TheValue; 
     dbRecord.TheValue = newval; 
     db.SaveChanges(); 
    } 
    } 

    return Json(new { success = true, oldval = oldval}, 
       JsonRequestBehavior.AllowGet); 
} 
+0

Hoàn hảo! Cảm ơn bạn rất nhiều ... –

+0

Làm việc đó một ông chủ :) –

+1

Cảm ơn bạn đã đăng các tùy chọn khắc phục sự cố cho Ajax. Điều này đã giúp tôi. – vibs2006

2

PartialViewResult và JSONReuslt kế thừa từ ActionResult lớp cơ sở. vì vậy nếu kiểu trả về được quyết định tự động khai báo đầu ra của phương thức là ActionResult.

public ActionResult DynamicReturnType(string parameter) 
     { 
      if (parameter == "JSON") 
       return Json("<JSON>", JsonRequestBehavior.AllowGet); 
      else if (parameter == "PartialView") 
       return PartialView("<ViewName>"); 
      else 
       return null; 


     } 
2
public ActionResult GetExcelColumn() 
    {    
      List<string> lstAppendColumn = new List<string>(); 
      lstAppendColumn.Add("First"); 
      lstAppendColumn.Add("Second"); 
      lstAppendColumn.Add("Third"); 
    return Json(new { lstAppendColumn = lstAppendColumn, Status = "Success" }, JsonRequestBehavior.AllowGet); 
      } 
     } 
+0

bạn có thể thêm một chút thông tin về việc này không? – RealCheeseLord

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