Yanıtlar:
Eylem yönteminizde, JSON'u sayfanıza döndürmek için Json'u (nesne) döndürün.
public ActionResult SomeActionMethod() {
return Json(new {foo="bar", baz="Blech"});
}
Sonra sadece Ajax kullanarak eylem yöntemini çağırın. ViewPage'den aşağıdaki gibi yardımcı yöntemlerden birini kullanabilirsiniz:
<%= Ajax.ActionLink("SomeActionMethod", new AjaxOptions {OnSuccess="somemethod"}) %>
SomeMethod daha sonra döndürülen Json nesnesini değerlendiren bir javascript yöntemi olacaktır.
Düz bir dize döndürmek istiyorsanız, ContentResult'u kullanabilirsiniz:
public ActionResult SomeActionMethod() {
return Content("hello world!");
}
ContentResult varsayılan olarak bir text / plain öğesini contentType olarak döndürür.
Bu yüklenebilir, böylece şunları da yapabilirsiniz:
return Content("<xml>This is poorly formatted xml.</xml>", "text/xml");
Bence isteğin AcceptTypes'ını düşünmelisin. Şu anki projemde aşağıdaki gibi doğru içerik türünü döndürmek için kullanıyorum.
Denetleyicideki eyleminiz isteği istek nesnesindeki gibi test edebilir
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"))
{
//
}
Daha sonra, kısmi xhtml yanıt vakasını karşılamak için görünümün aspx'ini uygulayabilirsiniz.
Daha sonra jQuery'de json olarak type parametresini geçirerek getirebilirsiniz:
$.get(url, null, function(data, textStatus) {
console.log('got %o with status %s', data, textStatus);
}, "json"); // or xml, html, script, json, jsonp or text
Umarım bu James'e yardım eder
JSON verileriyle başa çıkmanın bir başka güzel yolu da JQuery getJSON işlevini kullanmaktır. Şunu arayabilirsiniz:
public ActionResult SomeActionMethod(int id)
{
return Json(new {foo="bar", baz="Blech"});
}
Sadece jquery getJSON yönteminden yöntem ...
$.getJSON("../SomeActionMethod", { id: someId },
function(data) {
alert(data.foo);
alert(data.baz);
}
);
return Json(new {foo="bar", baz="Blech"});
yapar!
JQuery ile MVC ajax GET çağrıları uygularken birkaç sorun buldum, bu yüzden burada çözümler paylaşmam baş ağrılarına neden oldu.
JsonRequestBehavior.AllowGet
; Bu MVC olmadan bir HTTP 500 hatası ( dataType: json
istemcide belirtilen ile) döndürüyordu .cache: false
$ .Ajax çağrısına ekleyin , aksi takdirde sonuçta HTTP 304 yanıtları alırsınız (HTTP 200 yanıtları yerine) ve sunucu isteğinizi işlemez.Örnek 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);
}
});
Örnek MVC kodu:
[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);
}
Sorunun diğer yarısına cevap vermek için şunları arayabilirsiniz:
return PartialView("viewname");
kısmi HTML döndürmek istediğinizde. Belki de bir URL bölümüne / parametresine bağlı olarak, isteğin JSON veya HTML isteyip istemediğine karar vermenin bir yolunu bulmanız yeterlidir.
Kodlama çerçeveli alternatif çözüm
Eylem dönüş json
kontrolör
[HttpGet]
public ActionResult SomeActionMethod()
{
return IncJson(new SomeVm(){Id = 1,Name ="Inc"});
}
Ustura sayfası
@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())
Eylem dönüş html
kontrolör
[HttpGet]
public ActionResult SomeActionMethod()
{
return IncView();
}
Ustura sayfası
@(Html.When(JqueryBind.InitIncoding)
.Do()
.AjaxGet(Url.Action("SomeActionMethod","SomeContoller"))
.OnSuccess(dsl => dsl.Self().Core().Insert.Html())
.AsHtmlAttributes()
.ToDiv())
Bunu çok güzel kapsayan bu çok yararlı makaleye göz atmak isteyebilirsiniz!
Sadece bu soruna iyi bir çözüm arayan insanların yardımcı olabileceğini düşündüm.
http://weblogs.asp.net/rashid/archive/2009/04/15/adaptive-rendering-in-asp-net-mvc.aspx
PartialViewResult ve JSONReuslt temel sınıf ActionResult'dan miras alır. dönüş türüne dinamik olarak karar verilirse yöntem çıktısını ActionResult olarak bildirin.
public ActionResult DynamicReturnType(string parameter)
{
if (parameter == "JSON")
return Json("<JSON>", JsonRequestBehavior.AllowGet);
else if (parameter == "PartialView")
return PartialView("<ViewName>");
else
return null;
}
MVC 3'e yükseltme yapan kişiler için burada temiz bir yol MVC3 ve Json kullanma
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);
}
}
İsteğe bağlı farklı çıktılar üretmek için esnek yaklaşım
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);
}
}
Request.IsAjaxRequest()
Yöntem çok basittir: gelen istek görmek için sadece HTTP üst kontrol ederse değeri X İstenen-ile başlıktır XMLHttpRequest
otomatik olarak en tarayıcıları ve AJAX tarafından ekli olan,.
İsteğin json için olup olmadığını kontrol etmek için özel uzatma yöntemi, böylece Request.IsAjaxRequest () uzantı yöntemi gibi herhangi bir yerden çağırabiliriz:
using System;
using System.Web;
public static class JsonRequestExtensions
{
public static bool IsJsonRequest(this HttpRequestBase request)
{
return string.Equals(request["format"], "json");
}
}