ASP.NET actions du contrôleur MVC qui renvoient JSON ou html partiel

j'essaie de créer des actions de controller qui retourneront soit JSON soit une partie html selon un paramètre. Quelle est la meilleure façon d'obtenir le résultat retourné à une page MVC de façon asynchrone?

372
demandé sur tereško 2008-10-23 01:31:05

11 réponses

dans votre méthode d'action, retournez Json(objet) pour retourner JSON à votre page.

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

alors il suffit d'appeler la méthode D'action en utilisant Ajax. Vous pouvez utiliser l'une des méthodes helper de la page de vue comme

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

SomeMethod serait une méthode javascript qui évaluerait alors l'objet JSON retourné.

si vous voulez retourner une chaîne simple, vous pouvez simplement utiliser le ContentResult:

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

Contententresult par défaut renvoie un texte / plain comme son contentType.

Vous pouvez donc aussi faire:

return Content("<xml>This is poorly formatted xml.</xml>", "text/xml");
470
répondu Haacked 2009-08-07 19:25:30

je pense que vous devriez considérer les types acceptables de la demande. Je l'utilise dans mon projet actuel pour retourner le type de contenu correct comme suit.

votre action sur le controller peut le tester comme sur l'objet request ""

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

vous pouvez alors implémenter l'aspx de la vue pour répondre au cas de réponse partielle xhtml.

puis dans jQuery vous pouvez le récupérer en passant le paramètre de type comme 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

Espérons que cette aide James

106
répondu James Green 2012-08-08 13:33:28

une autre façon agréable de traiter les données JSON est d'utiliser la fonction JQuery getJSON. Vous pouvez appeler le

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

méthode de la méthode jquery getJSON par simple...

$.getJSON("../SomeActionMethod", { id: someId },
    function(data) {
        alert(data.foo);
        alert(data.baz);
    }
);
74
répondu SaaS Developer 2014-05-12 06:32:16

j'ai trouvé un couple de problèmes mettant en œuvre MVC ajax obtenir des appels avec JQuery qui m'a causé des maux de tête afin de partager des solutions ici.

  1. assurez-vous d'inclure le type de données "json" dans l'appel ajax. Cela analysera automatiquement l'objet JSON retourné pour vous (étant donné que le serveur renvoie JSON valide).
  2. inclut le JsonRequestBehavior.AllowGet ; sans cela, MVC retournait une erreur HTTP 500 (avec dataType: json spécifié sur le client).
  3. ajouter cache: false au $.appel ajax, sinon vous obtiendrez des réponses HTTP 304 (au lieu des réponses HTTP 200) et le serveur ne traitera pas votre requête.
  4. enfin, le json est sensible à la casse, de sorte que le boîtier des éléments doit correspondre du côté du serveur et du côté du client.

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

exemple de code 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);
}
42
répondu Shane 2018-01-23 12:05:40

pour répondre À l'autre moitié de la question, vous pouvez appeler:

return PartialView("viewname");

quand vous voulez retourner une partie du HTML. Vous aurez juste à trouver un moyen de décider si la requête veut JSON ou HTML, peut-être basé sur une partie/paramètre D'URL.

13
répondu Brad Wilson 2008-10-23 01:25:39

solution Alternative avec incoding cadre

Action de retour json

contrôleur

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

Rasoir page

@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 de retour html

contrôleur

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

Rasoir page

@(Html.When(JqueryBind.InitIncoding)
  .Do()
  .AjaxGet(Url.Action("SomeActionMethod","SomeContoller"))
  .OnSuccess(dsl => dsl.Self().Core().Insert.Html())
  .AsHtmlAttributes()
  .ToDiv())
7
répondu Vlad 2013-05-06 06:39:03

Vous pouvez prendre un coup d'oeil à cet article utile qui couvre très bien!

vient de penser que cela pourrait aider les gens à trouver une bonne solution à ce problème.

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

6
répondu Paul Hinett 2012-08-08 13:33:51

pour les gens qui ont mis à jour à MVC 3 Voici une manière soignée utilisant MVC3 et Json

4
répondu Sarath 2011-03-17 10:19:30

PartialViewResult et JSONReuslt hériter de la classe de base ActionResult. ainsi, si le type de retour est décidé dynamiquement déclarer la sortie de la méthode comme résultat D'action.

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


        }
3
répondu Anil Vaddepally 2017-08-08 05:35:38
    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);
            }
        }
2
répondu sakthi 2017-09-07 11:13:25

approche Flexible pour produire différents résultats basés sur la demande

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

la méthode Request.IsAjaxRequest() est assez simple: elle vérifie simplement les en-têtes HTTP pour la requête entrante pour voir si la valeur de L'en-tête X-Requested-With est XMLHttpRequest , qui est automatiquement ajouté par la plupart des navigateurs et cadres AJAX.

méthode D'extension personnalisée pour vérifier si la requête est pour json ou non afin que nous puissions l'appeler depuis n'importe où, tout comme la Demande.IsAjaxRequest() extension de la méthode:

using System;
using System.Web;

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

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

0
répondu Mannan Bahelim 2018-03-28 09:35:43