Câu trả lời:
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");
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
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 chỉ bằng cách ...
$.getJSON("../SomeActionMethod", { id: someId },
function(data) {
alert(data.foo);
alert(data.baz);
}
);
return Json(new {foo="bar", baz="Blech"});
nào!
Tôi đã tìm thấy một số vấn đề khi triển khai 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.
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).cache: false
cuộ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.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);
}
Để 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.
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 dao 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 dao cạo
@(Html.When(JqueryBind.InitIncoding)
.Do()
.AjaxGet(Url.Action("SomeActionMethod","SomeContoller"))
.OnSuccess(dsl => dsl.Self().Core().Insert.Html())
.AsHtmlAttributes()
.ToDiv())
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
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 phương thức đầu ra 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;
}
Đố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
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);
}
}
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");
}
}