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 ?
Réponses
Trop de publicités?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");
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
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.
- 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).
- Inclure l'
JsonRequestBehavior.AllowGet
; sans cette MVC retournait une erreur HTTP 500 (avecdataType: json
spécifiée sur le client). - 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. - 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);
}