Risposte:
Nel tuo metodo di azione, restituisci Json (oggetto) per restituire JSON alla tua pagina.
public ActionResult SomeActionMethod() {
return Json(new {foo="bar", baz="Blech"});
}
Quindi chiama il metodo di azione usando Ajax. È possibile utilizzare uno dei metodi di supporto da ViewPage come
<%= Ajax.ActionLink("SomeActionMethod", new AjaxOptions {OnSuccess="somemethod"}) %>
SomeMethod sarebbe un metodo javascript che quindi valuta l'oggetto Json restituito.
Se vuoi restituire una stringa semplice, puoi semplicemente usare ContentResult:
public ActionResult SomeActionMethod() {
return Content("hello world!");
}
ContentResult per impostazione predefinita restituisce un testo / semplice come contentType.
Questo è sovraccarico, quindi puoi anche fare:
return Content("<xml>This is poorly formatted xml.</xml>", "text/xml");
Penso che dovresti considerare gli AcceptTypes della richiesta. Lo sto usando nel mio progetto attuale per restituire il tipo di contenuto corretto come segue.
La tua azione sul controller può testarlo 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 parziale xhtml.
Quindi in jQuery puoi recuperarlo passando il parametro type come 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
Un altro bel modo di gestire i dati JSON è usare la funzione getJSON di JQuery. Puoi 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);
}
);
return Json(new {foo="bar", baz="Blech"});
fa!
Ho riscontrato un paio di problemi nell'implementazione delle chiamate GET ajax GET con JQuery che mi hanno causato mal di testa, quindi condividendo le soluzioni qui.
JsonRequestBehavior.AllowGet
; senza questo MVC stava restituendo un errore HTTP 500 (con dataType: json
specificato sul client).cache: false
alla chiamata $ .ajax, altrimenti alla fine otterrai risposte HTTP 304 (anziché HTTP 200) e il server non elaborerà la tua richiesta.Esempio di 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);
}
});
Codice MVC di esempio:
[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);
}
Per rispondere all'altra metà della domanda, puoi chiamare:
return PartialView("viewname");
quando si desidera restituire HTML parziale. Dovrai solo trovare un modo per decidere se la richiesta richiede JSON o HTML, magari in base a una parte / parametro URL.
Soluzione alternativa con framework di codifica
Azione ritorno json
controllore
[HttpGet]
public ActionResult SomeActionMethod()
{
return IncJson(new SomeVm(){Id = 1,Name ="Inc"});
}
Pagina del rasoio
@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())
Azione restituire html
controllore
[HttpGet]
public ActionResult SomeActionMethod()
{
return IncView();
}
Pagina del rasoio
@(Html.When(JqueryBind.InitIncoding)
.Do()
.AjaxGet(Url.Action("SomeActionMethod","SomeContoller"))
.OnSuccess(dsl => dsl.Self().Core().Insert.Html())
.AsHtmlAttributes()
.ToDiv())
Potresti dare un'occhiata a questo articolo molto utile che lo copre molto bene!
Ho pensato che potesse aiutare le persone a cercare una buona soluzione a questo problema.
http://weblogs.asp.net/rashid/archive/2009/04/15/adaptive-rendering-in-asp-net-mvc.aspx
PartialViewResult e JSONReuslt ereditano dalla classe base ActionResult. quindi, se il tipo restituito viene deciso, dichiarare in modo dinamico 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;
}
Per le persone che hanno effettuato l'aggiornamento a MVC 3, ecco un modo semplice di utilizzare MVC3 e Json
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);
}
}
Approccio flessibile per produrre output diversi in base alla richiesta
public class AuctionsController : Controller
{
public ActionResult Auction(long id)
{
var db = new DataContext();
var auction = db.Auctions.Find(id);
// Respond to AJAX requests
if (Request.IsAjaxRequest())
return PartialView("Auction", auction);
// Respond to JSON requests
if (Request.IsJsonRequest())
return Json(auction);
// Default to a "normal" view with layout
return View("Auction", auction);
}
}
Il Request.IsAjaxRequest()
metodo è abbastanza semplice: controlla semplicemente le intestazioni HTTP per la richiesta in arrivo per vedere se il valore dell'intestazione X-Requested-With è XMLHttpRequest
, che viene automaticamente aggiunto dalla maggior parte dei browser e dei framework AJAX.
Metodo di estensione personalizzato per verificare se la richiesta è per json o meno in modo che possiamo chiamarla da qualsiasi luogo, proprio come il metodo di estensione Request.IsAjaxRequest ():
using System;
using System.Web;
public static class JsonRequestExtensions
{
public static bool IsJsonRequest(this HttpRequestBase request)
{
return string.Equals(request["format"], "json");
}
}