2008-10-22 6 views

Répondre

443

Dans votre méthode d'action, renvoyez Json (objet) pour renvoyer JSON à votre page.

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

Appelez simplement la méthode d'action en utilisant Ajax. Vous pouvez utiliser l'une des méthodes d'aide de la ViewPage tels que

<%= 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 de caractères, vous pouvez simplement utiliser le ContentResult:

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

ContentResult par défaut retourne un texte/simple comme contentType.
C'est surchargeable vous pouvez donc aussi faire:

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

phil désolé! Cela ne répond pas vraiment à la question? C'est certainement utile, mais comme Brad dit que vous devez savoir d'une manière ou d'une autre ce qu'ils demandent et retourner le résultat en conséquence. –

+0

voir ma question un peu liée (bien celui qui m'a conduit ici) à http://stackoverflow.com/questions/482363/should-my-mvc-controller-really-know-about-json –

+9

si vous trouvez une réponse, lier dans la question elle-même. Aussi, je ne pense pas vérifier cela comme la réponse est la bonne chose. – Cherian

71

Une autre belle façon de traiter les données JSON utilise 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 simplement ...

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

Cela ne répond pas du tout à la question. – Aaronaught

+2

@Aaronaught En fait la première partie 'retourner Json (nouveau {foo =" bar ", baz =" Blech "});' fait! – SparK

12

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

return PartialView("viewname"); 

quand vous voulez retourner du HTML partiel. Vous devrez juste trouver un moyen de décider si la requête nécessite JSON ou HTML, peut-être en fonction d'une partie/paramètre d'URL.

+2

alors la question ne reste-t-elle pas sans réponse? –

+2

Cela ne répond pas à la question. – Aaronaught

+0

il cherche une requête ajax pour obtenir le html en utilisant PartialView nécessite une actualisation de la page sauf si vous retournez la vue d'une méthode d'action en utilisant un appel ajax –

103

Je pense que vous devriez considérer les AcceptTypes de la requête. Je l'utilise dans mon projet actuel pour renvoyer le type de contenu correct comme suit.

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

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 ensuite mettre en œuvre le ASPX de la vue de répondre le cas de réponse partielle xhtml.

Puis, en jQuery vous pouvez chercher faisant passer le paramètre de type 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 

Hope this helps James

+3

Merci James, cela pourrait être très utile pour créer une sorte de site web et un REST API utilisant les mêmes actions du contrôleur. – NathanD

+0

Si j'ai de nombreuses méthodes comme celle-ci dans mon contrôleur, est-ce que je peux le faire de façon plus générique? – Seph

+0

Dans quel espace de noms est la classe Json? Quelle est la dépendance pour project.json? Merci d'avance – Andrei

4

Pour les gens qui ont mis à jour pour MVC 3 ici est une belle façon Using MVC3 and Json

+1

vous pouvez également utiliser la même technique que cet article dans MVC 2 – longhairedsi

6

solution alternative avec incoding framework

retour d'action JSON

Contrôleur

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

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

retour Action html

Contrôleur

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

page Razor

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

J'ai trouvé quelques problèmes d'implémentation des appels ajax GET de MVC avec JQuery qui m'ont causé des maux de tête pour 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. Inclure le JsonRequestBehavior.AllowGet; sans ce MVC renvoyait une erreur HTTP 500 (avec dataType: json spécifié sur le client).
  3. Ajoutez cache: false à l'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é serveur et côté 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); 
} 
+0

Parfait! Merci beaucoup ... –

+0

Fonctionne un patron :) –

+1

Merci d'avoir posté des options de dépannage pour Ajax. Cela m'a aidé. – vibs2006

2

PartialViewResult et JSONReuslt hériter de la classe de base ActionResult. donc si le type de retour est décidé dynamiquement, déclarez la sortie de la méthode comme ActionResult.

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

pourriez-vous ajouter un peu plus d'informations sur ce que cela fait? – RealCheeseLord

Questions connexes