J'essaye de créer des actions de contrôleur qui retourneront JSON ou html partiel selon un paramètre. Quel est le meilleur moyen de renvoyer le résultat à une page MVC de manière asynchrone?actions du contrôleur ASP.NET MVC qui retournent JSON ou html partiel
Répondre
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");
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);
}
);
Cela ne répond pas du tout à la question. – Aaronaught
@Aaronaught En fait la première partie 'retourner Json (nouveau {foo =" bar ", baz =" Blech "});' fait! – SparK
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.
alors la question ne reste-t-elle pas sans réponse? –
Cela ne répond pas à la question. – Aaronaught
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 –
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
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
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
Dans quel espace de noms est la classe Json? Quelle est la dépendance pour project.json? Merci d'avance – Andrei
Vous pouvez jeter un oeil à cet article très utile qui couvre cette très bien! Je pensais juste que cela pourrait aider les gens à la recherche d'une bonne solution à ce problème.
http://weblogs.asp.net/rashid/archive/2009/04/15/adaptive-rendering-in-asp-net-mvc.aspx
Pour les gens qui ont mis à jour pour MVC 3 ici est une belle façon Using MVC3 and Json
vous pouvez également utiliser la même technique que cet article dans MVC 2 – longhairedsi
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())
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.
- 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).
- Inclure le
JsonRequestBehavior.AllowGet
; sans ce MVC renvoyait une erreur HTTP 500 (avecdataType: json
spécifié sur le client). - 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. - 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);
}
Parfait! Merci beaucoup ... –
Fonctionne un patron :) –
Merci d'avoir posté des options de dépannage pour Ajax. Cela m'a aidé. – vibs2006
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;
}
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);
}
}
pourriez-vous ajouter un peu plus d'informations sur ce que cela fait? – RealCheeseLord
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. –
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 –
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