Saya mencoba untuk membuat controller tindakan yang akan mengembalikan JSON atau parsial html tergantung pada parameter. Apa cara terbaik untuk mendapatkan hasil yang dikembalikan ke MVC halaman asynchronous?
Dalam tindakan metode, return Json(objek) untuk mengembalikan JSON ke halaman anda.
public ActionResult SomeActionMethod() {
return Json(new {foo="bar", baz="Blech"});
}
Kemudian panggil saja tindakan menggunakan metode Ajax. Anda bisa menggunakan salah satu dari metode pembantu dari ViewPage seperti
<%= Ajax.ActionLink("SomeActionMethod", new AjaxOptions {OnSuccess="somemethod"}) %>
SomeMethod akan menjadi javascript metode yang kemudian mengevaluasi objek Json kembali.
Jika anda ingin mengembalikan sebuah string sederhana, anda hanya dapat menggunakan ContentResult:
public ActionResult SomeActionMethod() {
return Content("hello world!");
}
ContentResult secara default kembali text/plain sebagai contentType. Ini adalah overloadable sehingga anda juga dapat melakukan:
return Content("<xml>This is poorly formatted xml.</xml>", "text/xml");
Saya pikir anda harus mempertimbangkan AcceptTypes permintaan. Saya menggunakan ini dalam proyek saya saat ini untuk kembali memperbaiki jenis konten sebagai berikut.
Anda action pada controller dapat menguji hal ini seperti pada permintaan objek
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"))
{
//
}
Anda kemudian dapat menerapkan aspx pandangan untuk memenuhi sebagian xhtml respon kasus.
Kemudian di jQuery anda dapat mengambilnya lewat jenis parameter sebagai 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
Semoga ini bisa membantu James
Lain cara yang baik untuk menangani data JSON menggunakan JQuery getJSON fungsi. Anda dapat menghubungi
public ActionResult SomeActionMethod(int id)
{
return Json(new {foo="bar", baz="Blech"});
}
Metode jquery getJSON metode dengan hanya...
$.getJSON("../SomeActionMethod", { id: someId },
function(data) {
alert(data.foo);
alert(data.baz);
}
);
Saya menemukan beberapa masalah implementasi MVC ajax MENDAPATKAN panggilan dengan JQuery yang menyebabkan saya sakit kepala sehingga berbagi solusi di sini.
JsonRequestBehavior.AllowGet
; tanpa ini MVC kembali HTTP error 500 (dengan dataType: json
ditentukan pada klien).cache: false
ke $.ajax panggilan, jika tidak, anda akan akhirnya mendapatkan HTTP 304 responses (bukan HTTP 200 responses) dan server tidak akan memproses permintaan anda.Contoh 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);
}
});
Contoh MVC kode:
[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);
}
Untuk menjawab setengah dari pertanyaan, anda dapat menghubungi:
return PartialView("viewname");
bila anda ingin kembali parsial HTML. Anda'll hanya harus menemukan beberapa cara untuk memutuskan apakah permintaan ingin JSON atau HTML, mungkin didasarkan pada bagian URL/parameter.
Solusi alternatif dengan incoding framework
Tindakan mengembalikan json
Kontrol
[HttpGet]
public ActionResult SomeActionMethod()
{
return IncJson(new SomeVm(){Id = 1,Name ="Inc"});
}
Razor halaman
@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())
Aksi kembali html
Kontrol
[HttpGet]
public ActionResult SomeActionMethod()
{
return IncView();
}
Razor halaman
@(Html.When(JqueryBind.InitIncoding)
.Do()
.AjaxGet(Url.Action("SomeActionMethod","SomeContoller"))
.OnSuccess(dsl => dsl.Self().Core().Insert.Html())
.AsHtmlAttributes()
.ToDiv())
Anda mungkin ingin mengambil melihat ini sangat membantu artikel yang mencakup hal ini sangat baik!
Hanya berpikir itu mungkin membantu orang-orang mencari solusi yang baik untuk masalah ini.
http://weblogs.asp.net/rashid/archive/2009/04/15/adaptive-rendering-in-asp-net-mvc.aspx
PartialViewResult dan JSONReuslt mewarisi dari kelas dasar ActionResult. jadi jika kembali jenis ini memutuskan secara dinamis menyatakan metode output sebagai 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);
}
}
Pendekatan yang fleksibel untuk menghasilkan output yang berbeda berdasarkan permintaan
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);
}
}
The Permintaan.IsAjaxRequest()
metode ini cukup sederhana: hanya memeriksa HTTP header untuk permintaan yang masuk untuk melihat apakah nilai X-Diminta-Dengan tajuk XMLHttpRequest
, yang secara otomatis ditambahkan oleh sebagian besar browser dan AJAX framework.
Ekstensi kustom metode untuk memeriksa apakah permintaan untuk json atau tidak sehingga kita dapat panggilan dari mana saja, seperti Permintaan.IsAjaxRequest() metode penyuluhan:
using System;
using System.Web;
public static class JsonRequestExtensions
{
public static bool IsJsonRequest(this HttpRequestBase request)
{
return string.Equals(request["format"], "json");
}
}