JSON veya kısmi html döndüren ASP.NET MVC denetleyici eylemleri


406

Bir parametreye bağlı olarak JSON veya kısmi html döndürecek denetleyici eylemleri oluşturmaya çalışıyorum. Sonucu bir MVC sayfasına eşzamansız olarak döndürmenin en iyi yolu nedir?

Yanıtlar:


519

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");

9
üzgünüm phil! bu aslında soruyu cevaplamıyor mu? kesinlikle yararlı ama brad'ın dediği gibi bir şekilde ne istediklerini bulmanız ve sonucu buna göre geri getirmeniz gerekiyor.
Simon_Weaver


9
bir cevap bulursanız, sorunun kendisinde bağlantılandırın. Ayrıca cevap doğru şey olarak bu kontrol sanmıyorum.
Cherian,


O Json sınıfının tam adı nedir?
Josh Withee

112

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


5
Teşekkürler James, bu, aynı Denetleyici Eylemlerini kullanarak bir web sitesi ve bir REST API'si oluşturmak için çok yararlı olabilir.
NathanD

Denetleyicimde böyle birçok yöntem varsa, bunu daha genel olarak yapabilmemin herhangi bir yolu var mı?
Seph

Json sınıfı hangi ad alanındadır? Project.json için bağımlılık nedir? Şimdiden teşekkürler
Andrei

1
Bu System.Web.Mvc (System.Web.Mvc.dll içinde) JsonResult sınıfı @Andrei
James Green

Teşekkürler, buldum. Cevabı yeni API'yı yansıtacak şekilde güncelleyebilir misiniz? Btw, Microsoft.AspNetCore.Mvc.JsonResult olduğu yerde dotnet core kullanıyorum.
Andrei

78

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

15
Bu soruya hiç cevap vermiyor.
Aaronaught

2
@Aaronaught Aslında ilk kısmı return Json(new {foo="bar", baz="Blech"});yapar!
SparK

Ayrıca $ .post stackoverflow.com/questions/751218/… (ASP.Net MVC, JSON'u devre dışı bırakmak için varsayılanları devre dışı bırakır)
Greg

50

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.

  1. Ajax çağrısına "json" veri türünü eklediğinizden emin olun. Bu, döndürülen JSON nesnesini sizin için otomatik olarak ayrıştırır (sunucu geçerli json döndürdüğü takdirde).
  2. Dahil et JsonRequestBehavior.AllowGet; Bu MVC olmadan bir HTTP 500 hatası ( dataType: jsonistemcide belirtilen ile) döndürüyordu .
  3. 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.
  4. Son olarak, json büyük / küçük harfe duyarlıdır, bu nedenle elemanların kasasının sunucu tarafında ve istemci tarafında eşleşmesi gerekir.

Ö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);
}

13

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.


2
yani soru cevapsız kalmıyor mu?
Simon_Weaver

2
Bu soruya cevap vermiyor.
Aaronaught

ajax çağrısı kullanarak bir eylem yönteminden görünümü döndürmediğiniz sürece PartialView kullanarak html almak için bir ajax isteği arıyor
Chris McGrath

7

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


4

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;


        }


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

Bunun ne yaptığı hakkında biraz daha bilgi ekleyebilir misiniz?
RealCheeseLord

Kodunuz dönüş
JSON'u gösterdiğinden

0

İ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 XMLHttpRequestotomatik 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");
  }
}

Kaynak: https://www.safaribooksonline.com/library/view/programming-aspnet-mvc/9781449321932/ch06.html#_javascript_rendering

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.