Sto provando a creare azioni del controller che restituiranno JSON o html parziale in base a un parametro. Qual è il modo migliore per ottenere il risultato restituito a una pagina MVC in modo asincrono?Azioni del controller ASP.NET MVC che restituiscono JSON o HTML parziale
risposta
Nel metodo di azione, restituire Json (oggetto) per restituire JSON alla pagina.
public ActionResult SomeActionMethod() {
return Json(new {foo="bar", baz="Blech"});
}
Quindi basta chiamare il metodo di azione utilizzando Ajax. È possibile utilizzare uno dei metodi helper dal ViewPage come
<%= Ajax.ActionLink("SomeActionMethod", new AjaxOptions {OnSuccess="somemethod"}) %>
SomeMethod sarebbe un metodo JavaScript che valuta quindi l'oggetto JSON restituito.
Se si desidera restituire una stringa semplice, si può semplicemente utilizzare il ContentResult:
public ActionResult SomeActionMethod() {
return Content("hello world!");
}
ContentResult di default restituisce un text/plain come contentType.
Questo è sovraccaricabile modo da poter fare:
return Content("<xml>This is poorly formatted xml.</xml>", "text/xml");
Un altro bel modo di trattare con i dati JSON utilizza la funzione di JQuery getJSON. È possibile chiamare il
public ActionResult SomeActionMethod(int id)
{
return Json(new {foo="bar", baz="Blech"});
}
Metodo dal metodo jquery getJSON semplicemente ...
$.getJSON("../SomeActionMethod", { id: someId },
function(data) {
alert(data.foo);
alert(data.baz);
}
);
Questo non risponde affatto alla domanda. – Aaronaught
@Aaronaught In realtà la prima parte 'return Json (new {foo =" bar ", baz =" Blech "});' does! – SparK
Per rispondere l'altra metà della domanda, è possibile chiamare:
return PartialView("viewname");
quando vuoi restituire un codice HTML parziale. Dovrai solo trovare un modo per decidere se la richiesta vuole JSON o HTML, magari in base a una parte/parametro URL.
quindi la domanda rimane senza risposta? –
Questo non risponde alla domanda. – Aaronaught
sta cercando una richiesta ajax per ottenere l'html utilizzando PartialView richiede un aggiornamento della pagina a meno che non si restituisca la vista da un metodo di azione utilizzando una chiamata ajax –
Penso che dovresti considerare AcceptTypes della richiesta. Lo sto utilizzando nel mio progetto corrente per restituire il tipo di contenuto corretto come segue.
L'azione sul controller può testare come sull'oggetto richiesta
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"))
{
//
}
È quindi possibile implementare l'aspx della vista per soddisfare il caso di risposta xhtml parziale.
Poi in jQuery si può prenderlo passando il parametro tipo 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
Spero che questo aiuti James
Grazie James, che potrebbe essere molto utile per creare una sorta di sito Web e un REST API che utilizza le stesse azioni del controllore. – NathanD
Se ho molti metodi come questo nel mio controller, c'è un modo per farlo in modo più generico? – Seph
In quale spazio dei nomi è la classe Json? Qual è la dipendenza di project.json? Grazie in anticipo – Andrei
Si consiglia di dare un'occhiata a questo articolo molto utile che copre questo bene!
Ho pensato che potrebbe aiutare le persone alla ricerca di una buona soluzione a questo problema.
http://weblogs.asp.net/rashid/archive/2009/04/15/adaptive-rendering-in-asp-net-mvc.aspx
Per le persone che hanno eseguito l'aggiornamento a MVC 3: ecco un modo pulito Using MVC3 and Json
puoi anche utilizzare la stessa tecnica di questo articolo in MVC 2 – longhairedsi
soluzione alternativa con incoding framework
ritorno Azione JSON
controller
[HttpGet]
public ActionResult SomeActionMethod()
{
return IncJson(new SomeVm(){Id = 1,Name ="Inc"});
}
pagina 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())
ritorno Azione html
controller
[HttpGet]
public ActionResult SomeActionMethod()
{
return IncView();
}
pagina Razor
@(Html.When(JqueryBind.InitIncoding)
.Do()
.AjaxGet(Url.Action("SomeActionMethod","SomeContoller"))
.OnSuccess(dsl => dsl.Self().Core().Insert.Html())
.AsHtmlAttributes()
.ToDiv())
Ho trovato un paio di problemi nell'implementare MVC ajax. Le chiamate GET con JQuery mi hanno causato grattacapi in modo da condividere le soluzioni qui.
- Assicurarsi di includere il tipo di dati "json" nella chiamata ajax. Questo analizzerà automaticamente l'oggetto JSON restituito per te (dato che il server restituisce un json valido).
- Include
JsonRequestBehavior.AllowGet
; senza questo MVC restituiva un errore HTTP 500 (condataType: json
specificato sul client). - Aggiungi
cache: false
alla chiamata $ .ajax, altrimenti alla fine otterrai risposte HTTP 304 (anziché risposte HTTP 200) e il server non elaborerà la richiesta. - Infine, il json fa distinzione tra maiuscole e minuscole, quindi l'involucro degli elementi deve corrispondere sul lato server e sul lato client.
JQuery Esempio:
$.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);
}
});
Esempio codice 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);
}
Perfetto! Grazie mille ... –
Funziona come un capo :) –
Grazie per aver postato le opzioni di risoluzione dei problemi per Ajax. Questo mi ha aiutato. – vibs2006
PartialViewResult e JSONReuslt ereditare dalla classe base ActionResult. quindi se il tipo di ritorno è deciso dinamicamente, dichiara l'output del metodo come 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);
}
}
potresti aggiungere un po 'di informazioni in più su ciò che fa? – RealCheeseLord
- 1. ASP.NET MVC: I controller chiamati da AJAX restituiscono JSON o resi html?
- 2. ASP.NET MVC controller azioni design
- 3. Sovraccarico Azioni MVC ASP.NET
- 4. Accesso all'elenco di controller/azioni in un'applicazione ASP.NET MVC
- 5. ASP.NET MVC Utilizzo del rendering parziale da un helper HTML
- 6. Javascript - Json o html?
- 7. Deserializzare oggetti JSON in controller MVC Asp.Net
- 8. ASP.Net MVC: invio JSON al controller
- 9. azioni MVC JSON ritorno bool
- 10. Asp.net MVC json o Json.net?
- 11. asp.net MVC vista parziale azione del controllore
- 12. Azione controller ASP.NET MVC 3 per vista parziale
- 13. Devo esporre i metodi web tramite azioni ASP.NET MVC o WCF?
- 14. Restituisce Vista parziale e JSON dall'azione MVC ASP.NET
- 15. Applicazione del filtro azione su tutte le azioni del controller (C#/ASP.NET MVC)
- 16. Convenzioni di denominazione MVC per azioni JSON
- 17. Spring MVC controller return HTML
- 18. messaggio JSON alla primavera del controller MVC
- 19. ASP.NET MVC: passaggio del DateTime JSON al controller che non esegue il mapping ai parametri del controller
- 20. ASP.NET MVC Autentica prima del controller istanziato
- 21. È stato impostato un attributo relativo a AJAX per le azioni del controller ASP.NET MVC?
- 22. MVC restituisce la vista parziale come JSON
- 23. ASP.NET MVC - Aggiornamento parziale del modello dalla vista
- 24. Fabbrica controller ASP.NET MVC 6
- 25. Impossibile ottenere il controller ASP.NET MVC 6 per restituire JSON
- 26. asp.net mvc controller generico
- 27. ASP.NET MVC invio di dati JSON a un controller Azione
- 28. ASP.NET MVC - Esegue l'azione del controller senza reindirizzamento
- 29. Prestazioni di asp.net WebAPI vs controller MVC asp.net che emette JSON?
- 30. Controller asincrono in ASP.NET MVC
dispiace phil! questo in realtà non risponde alla domanda lo fa? è sicuramente utile, ma come dice Brad devi scoprire in qualche modo cosa stanno chiedendo e restituire il risultato di conseguenza. –
vedi la mia domanda in qualche modo correlata (beh quella che mi ha portato qui) su http://stackoverflow.com/questions/482363/should-my-mvc-controller-really-know-about-json –
se trovi una risposta, collegalo alla domanda stessa. Inoltre non penso di controllare questo dato che la risposta è la cosa giusta. – Cherian