Acțiuni de controler ASP.NET MVC care returnează JSON sau html parțial (Programare, Ajax, Asp.Net Mvc, Json, Asp.Net Ajax)

NathanD a intrebat.

Încerc să creez acțiuni de controler care să returneze fie JSON, fie html parțial, în funcție de un parametru. Care este cea mai bună modalitate de a obține rezultatul returnat către o pagină MVC în mod asincron?

11 răspunsuri
Haacked

În metoda ta de acțiune, returnează Json(object) pentru a returna JSON către pagina ta.

public ActionResult SomeActionMethod() {
  return Json(new {foo="bar", baz="Blech"});
}

Apoi, apelați pur și simplu metoda de acțiune folosind Ajax. Ați putea utiliza una dintre metodele de ajutor din ViewPage, cum ar fi

<%= Ajax.ActionLink("SomeActionMethod", new AjaxOptions {OnSuccess="somemethod"}) %>

SomeMethod ar fi o metodă javascript care apoi evaluează obiectul Json returnat.

Dacă doriți să returnați un simplu șir de caractere, puteți utiliza ContentResult:

public ActionResult SomeActionMethod() {
    return Content("hello world!");
}

ContentResult returnează în mod implicit un text/plain ca tip de conținut (contentType).
Acest lucru poate fi supraîncărcat, astfel încât puteți face și:

return Content("<xml>This is poorly formatted xml.</xml>", "text/xml");

Comentarii

  • Îmi pare rău Phil! Acest lucru nu răspunde de fapt la întrebare, nu-i așa? Este cu siguranță util, dar, așa cum spune Brad, trebuie să aflați cumva ce se cere și să returnați rezultatul în consecință. –  > Por Simon_Weaver.
  • vedeți întrebarea mea oarecum legată de aceasta (cea care m-a condus aici) la stackoverflow.com/questions/482363/… – –  > Por Simon_Weaver.
  • dacă găsești un răspuns, fă un link în întrebarea însăși. De asemenea, nu cred că bifarea acestui răspuns ca răspuns este lucrul corect. –  > Por Cherian.
  • stackoverflow.com/questions/320291/…. este legat –  > Por Cherian.
  • Care este numele complet calificat al acelei clase Json? –  > Por Josh Withee.
James Green

Cred că ar trebui să luați în considerare AcceptTypes al cererii. Îl folosesc în proiectul meu actual pentru a returna tipul de conținut corect, după cum urmează.

Acțiunea dvs. de pe controler poate fi testată ca pe obiectul cererii

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"))
{
   //
}

Puteți apoi să implementați aspx-ul vizualizării pentru a răspunde la cazul răspunsului parțial xhtml.

Apoi, în jQuery, îl puteți prelua trecând parametrul tip ca 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

Sper că vă ajutăJames

Comentarii

  • Mulțumesc James, ar putea fi foarte util pentru crearea unui fel de site web și a unui API REST folosind aceleași acțiuni de control. –  > Por NathanD.
  • Dacă am multe metode de acest fel în controlerul meu, există vreo modalitate de a face acest lucru mai generic? –  > Por Seph.
  • În ce spațiu de nume se află clasa Json? Care este dependența pentru project.json? Mulțumesc anticipat.  > Por Andrei.
  • Aceasta este Clasa JsonResult din System.Web.Mvc (în System.Web.Mvc.dll) @Andrei  > Por James Green.
  • Mulțumesc, am găsit-o. Poate actualizați răspunsul pentru a reflecta noul API? Btw, eu folosesc dotnet core unde este Microsoft.AspNetCore.Mvc.JsonResult. –  > Por Andrei.
Dezvoltator SaaS

O altă modalitate frumoasă de a trata datele JSON este folosirea funcției JQuery getJSON. Puteți apela funcția

public ActionResult SomeActionMethod(int id) 
{ 
    return Json(new {foo="bar", baz="Blech"});
}

Metoda din metoda jquery getJSON prin simpla…

$.getJSON("../SomeActionMethod", { id: someId },
    function(data) {
        alert(data.foo);
        alert(data.baz);
    }
);

Comentarii

    15

  • Acest lucru nu răspunde deloc la întrebare. –  > Por Aaronaught.
  • @Aaronaught De fapt, prima parte return Json(new {foo="bar", baz="Blech"}); da! –  > Por SparK.
  • De asemenea, luați în considerare $.post stackoverflow.com/questions/751218/… ( ASP.Net MVC dezactivează în mod implicit solicitările JSON Get din motive de securitate ) – –  > Por Greg.
Shane

Am găsit câteva probleme de implementare a apelurilor MVC ajax GET cu JQuery care mi-au provocat dureri de cap, așa că împărtășesc soluțiile aici.

  1. Asigurați-vă că includeți tipul de date „json” în apelul ajax. Acest lucru va analiza automat obiectul JSON returnat pentru dvs. (având în vedere că serverul returnează json valid).
  2. Includeți opțiunea JsonRequestBehavior.AllowGet; fără acest lucru, MVC returna o eroare HTTP 500 (cu dataType: json specificată pe client).
  3. Adăugați cache: false la apelul $.ajax, altfel veți primi în cele din urmă răspunsuri HTTP 304 (în loc de răspunsuri HTTP 200), iar serverul nu vă va procesa cererea.
  4. În cele din urmă, json este sensibil la majuscule și minuscule, astfel încât majusculele elementelor trebuie să se potrivească pe partea serverului și pe partea clientului.

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

Exemplu de cod 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);
}

Brad Wilson

Pentru a răspunde la cealaltă jumătate a întrebării, puteți apela:

return PartialView("viewname");

atunci când doriți să returnați HTML parțial. Va trebui doar să găsiți o modalitate de a decide dacă cererea dorește JSON sau HTML, poate pe baza unei părți/parametru URL.

Comentarii

  • deci întrebarea nu rămâne fără răspuns? –  > Por Simon_Weaver.
  • Acest lucru nu răspunde la întrebare. –  > Por Aaronaught.
  • el caută o cerere ajax pentru a obține html-ul folosind PartialView necesită o reîmprospătare a paginii, cu excepția cazului în care returnezi vizualizarea dintr-o metodă de acțiune folosind un apel ajax.  > Por Chris McGrath.
Vlad

Soluție alternativă cu incoding framework

Acțiunea returnează json

Controller

    [HttpGet]
    public ActionResult SomeActionMethod()
    {
        return IncJson(new SomeVm(){Id = 1,Name ="Inc"});
    }

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

Acțiune return html

Controler

    [HttpGet]
    public ActionResult SomeActionMethod()
    {
        return IncView();
    }

Pagina Razor

@(Html.When(JqueryBind.InitIncoding)
  .Do()
  .AjaxGet(Url.Action("SomeActionMethod","SomeContoller"))
  .OnSuccess(dsl => dsl.Self().Core().Insert.Html())
  .AsHtmlAttributes()
  .ToDiv())

Paul Hinett

Poate doriți să aruncați o privire la acest articol foarte util care acoperă foarte bine acest aspect!

M-am gândit că ar putea ajuta oamenii care caută o soluție bună la această problemă.

http://weblogs.asp.net/rashid/archive/2009/04/15/adaptive-rendering-in-asp-net-mvc.aspx

Anil Vaddepally

PartialViewResult și JSONReuslt moștenesc din clasa de bază ActionResult. deci, dacă tipul de returnare este decis în mod dinamic, declarați ieșirea metodei ca fiind ActionResult.

public ActionResult DynamicReturnType(string parameter)
        {
            if (parameter == "JSON")
                return Json("<JSON>", JsonRequestBehavior.AllowGet);
            else if (parameter == "PartialView")
                return PartialView("<ViewName>");
            else
                return null;


        }

Sarath

Pentru cei care au făcut upgrade la MVC 3, iată o metodă bunăFolosind MVC3 și Json

Comentarii

  • puteți utiliza aceeași tehnică ca în acest articol și în MVC 2 –  > Por longhairedsi.
sakthi
    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);
            }
        }

Comentarii

  • ați putea adăuga ceva mai multe informații despre ce face acest lucru? –  > Por RealCheeseLord.
  • Din moment ce codul dvs. arată că returnează JSON, tipul de returnare ar trebui să fie JsonResult și nu ActionResult –  > Por noobprogrammer.
Mannan Bahelim

Abordare flexibilă pentru a produce ieșiri diferite în funcție de cerere

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() este destul de simplă: verifică pur și simplu anteturile HTTP pentru cererea primită pentru a vedea dacă valoarea antetului X-Requested-With este XMLHttpRequest, , care este adăugat automat de majoritatea browserelor și a cadrelor AJAX.

Metoda de extensie personalizată pentru a verifica dacă cererea este pentru json sau nu, astfel încât să o putem apela de oriunde, la fel ca metoda de extensie Request.IsAjaxRequest():

using System;
using System.Web;

public static class JsonRequestExtensions
{
  public static bool IsJsonRequest(this HttpRequestBase request)
  {
    return string.Equals(request["format"], "json");
  }
}

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