421 votes

Actions du contrôleur ASP.NET MVC qui retournent JSON ou partielle html

Je suis en train de créer des actions du contrôleur qui seront de retour JSON ou partielle html dépendant d’un paramètre. Quelle est la meilleure façon d’obtenir le résultat renvoyé vers une page MVC asynchrone ?

538voto

Haacked Points 31070

Dans votre méthode d'action, de retour Json(objet) de retour JSON de votre page.

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

Puis il suffit d'appeler la méthode de l'action à l'aide d'Ajax. Vous pouvez utiliser l'une des méthodes d'aide à partir de la ViewPage comme

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

SomeMethod serait une méthode javascript qui évalue ensuite l'objet Json retourné.

Si vous voulez retourner une chaîne simple, il vous suffit d'utiliser le ContentResult:

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

ContentResult retourne, par défaut, un texte/plaine que son contentType.
C'est overloadable de sorte que vous pouvez faire:

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

113voto

James Green Points 996

Je pense que vous devriez considérer la AcceptTypes de la demande. Je l’utilise dans mon projet actuel pour retourner le type de contenu correct comme suit.

Votre action sur le contrôleur peut tester comme sur l’objet de la demande

Vous pouvez alors implémenter l’aspx d’avis de répondre dans le cas de réponse partielle xhtml.

Puis dans jQuery, vous pouvez extraire il en passant le paramètre de type JSON :

Espérons que cette aide James

82voto

SaaS Developer Points 4577

Une autre belle façon de traiter les données JSON est à l’aide de la fonction getJSON de JQuery. Vous pouvez appeler le

Méthode à partir de la méthode de getJSON jquery par simplement...

52voto

Shane Kenyon Points 1156

J'ai trouvé un couple de questions de mise en œuvre de MVC REÇOIS des appels ajax avec JQuery qui m'a causé des maux de tête si le partage des solutions ici.

  1. Assurez-vous d'inclure le type de données "json" dans l'appel ajax. Cela va automatiquement analyser le retour de l'objet JSON pour vous (étant donné que le serveur retourne json valide).
  2. Inclure l' JsonRequestBehavior.AllowGet; sans cette MVC retournait une erreur HTTP 500 (avec dataType: json spécifiée sur le client).
  3. Ajouter cache: false $.appel ajax, sinon vous finirez par obtenir HTTP 304 réponses (au lieu de HTTP 200 réponses) et le serveur ne peut pas traiter votre demande.
  4. Enfin, le json est sensible à la casse, de sorte que le boîtier de l'élément doit correspondre à côté serveur et côté client.

Exemple De 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 MVC code:

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

13voto

Brad Wilson Points 22910

Pour répondre à l’autre moitié de la question, vous pouvez appeler :

Lorsque vous voulez retourner partielle HTML. Vous aurez juste à trouver un moyen de décider si la demande veut JSON ou HTML, peut-être fondée sur un partie/paramètre d’URL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X