Tôi đang cố tạo hành động điều khiển sẽ trả về JSON hoặc một phần html tùy thuộc vào thông số. Cách tốt nhất để có được kết quả được trả về một trang MVC không đồng bộ là gì?Hành động của bộ điều khiển ASP.NET MVC trả về JSON hoặc một phần html
Trả lời
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");
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);
}
);
Điều này không trả lời được câu hỏi nào cả. – Aaronaught
@Aaronaught Trên thực tế phần đầu tiên 'return Json (new {foo =" bar ", baz =" Blech "});' hiện! – SparK
Để 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.
do đó, không câu hỏi vẫn chưa được trả lời? –
Điều này không trả lời được câu hỏi. – Aaronaught
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 –
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
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
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
Trong đó không gian tên là lớp Json? Phụ thuộc cho project.json là gì? Cảm ơn trước – Andrei
Bạn có thể muốn xem xét bài viết rất hữu ích này bao gồm 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 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
Đố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
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
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())
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.
- Đả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ệ).
- Bao gồm
JsonRequestBehavior.AllowGet
; mà không có MVC này đã trả lại lỗi HTTP 500 (vớidataType: json
được chỉ định trên máy khách). - 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. - 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);
}
Hoàn hảo! Cảm ơn bạn rất nhiều ... –
Làm việc đó một ông chủ :) –
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
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;
}
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);
}
}
bạn có thể thêm một chút thông tin về việc này không? – RealCheeseLord
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. –
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 –
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