382

Tôi đang cố gắng tạo các hành động của bộ điều khiển sẽ trả về JSON hoặc một phần html tùy thuộc vào một tham số. Cách tốt nhất để đưa kết quả được trả về một trang MVC không đồng bộ là gì?

|
485

Trong phương thức hành động của bạn, trả về Json (đối tượng) để trả JSON về 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, chẳng hạn như

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

Một sốMethod sẽ là một phương thức javascript để sau đó đá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 văn bản / đơn giản là contentType của nó.
Điều này là quá tải nên bạn cũng có thể làm:

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

Tôi nghĩ bạn nên xem xét các 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ề loại 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ể triển khai aspx của chế độ xem để phục vụ cho trường hợp phản hồi xhtml một phần.

Sau đó, trong jQuery bạn có thể tìm nạp nó qua tham số kiểu là 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

Hy vọng điều này sẽ giúp James

|
75

Một cách hay khác để xử lý dữ liệu JSON là sử dụng hàm JQuery getJSON. Bạn có thể gọi

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

Phương thức từ phương thức jquery getJSON bằng cách đơn giản là ...

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

Tôi đã tìm thấy một số vấn đề khi thực hiện các cuộc gọi GET ajax MVC với JQuery khiến tôi đau đầu nên chia sẻ giải pháp tại đây.

  1. Đảm bảo bao gồm kiểu dữ liệu "json" trong lệnh 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; không có MVC này đã trả về lỗi HTTP 500 ( dataType: jsonđược chỉ định trên máy khách).
  3. Thêm vào cache: falsecuộc gọi $ .ajax, nếu không, cuối cùng bạn 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ã MVC mẫu:

[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);
}
|
13

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

return PartialView("viewname");

khi bạn muốn trả về 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 muốn JSON hay HTML, có lẽ dựa trên một phần / tham số URL.

|
7

Giải pháp thay thế với khung mã hóa

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

Bộ điều khiển

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

Trang cạo

@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())

Hành động trả về html

Bộ điều khiển

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

Trang cạo

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

Bạn có thể muốn xem qua bài viết rất hữu ích này bao gồm điều này rất độc đáo!

Chỉ cần nghĩ rằng nó có thể giúp mọi người tìm kiếm một giải pháp tốt cho vấn đề này.

http://weblogs.asp.net/rashid/archive/2009/04/15/adaptive-rendering-in-asp-net-mvc.aspx

|
4

Đối với những người đã nâng cấp lên MVC 3, đây là một cách gọn gàng bằng cách sử dụng MVC3 và Json

|
3

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

Cách tiếp cận linh hoạt để tạo ra các đầu ra khác nhau dựa trên yêu cầu

public class AuctionsController : Controller
{
  public ActionResult Auction(long id)
  {
    var db = new DataContext();
    var auction = db.Auctions.Find(id);

    // Respond to AJAX requests
    if (Request.IsAjaxRequest())
      return PartialView("Auction", auction);

    // Respond to JSON requests
    if (Request.IsJsonRequest())
      return Json(auction);

    // Default to a "normal" view with layout
    return View("Auction", auction);
  }
}

Các Request.IsAjaxRequest()phương pháp khá đơn giản: nó chỉ kiểm tra các tiêu đề HTTP cho các yêu cầu gửi đến để xem nếu giá trị của X-yêu cầu-Với tiêu đề là XMLHttpRequest, được tự động thêm bởi hầu hết các trình duyệt và các khuôn khổ AJAX.

Phương thức tiện ích mở rộng tùy chỉnh để kiểm tra xem yêu cầu có dành cho json hay không để chúng tôi có thể gọi nó từ bất kỳ đâu, giống như phương thức tiện ích mở rộng Request.IsAjaxRequest ():

using System;
using System.Web;

public static class JsonRequestExtensions
{
  public static bool IsJsonRequest(this HttpRequestBase request)
  {
    return string.Equals(request["format"], "json");
  }
}

Nguồn: https://www.safaribooksonline.com/lvern/view/programming-aspnet-mvc/9781449321932/ch06.html#_javascript_Vndering

|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.