it-swarm.com.de

ASP.NET MVC-Controlleraktionen, die JSON oder teilweise HTML zurückgeben

Ich versuche Controller-Aktionen zu erstellen, die je nach Parameter entweder JSON oder teilweise HTML zurückgeben. Was ist der beste Weg, um das Ergebnis asynchron an eine MVC-Seite zurückzugeben?

376
NathanD

Geben Sie in Ihrer Aktionsmethode Json (Objekt) zurück, um JSON zu Ihrer Seite zurückzugeben.

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

Dann rufen Sie einfach die Aktionsmethode mit Ajax auf. Sie können eine der Hilfemethoden aus ViewPage verwenden, z 

<%= Ajax.ActionLink("SomeActionMethod", new AjaxOptions {OnSuccess="somemethod"}) %>

SomeMethod wäre eine Javascript-Methode, die dann das zurückgegebene Json-Objekt auswertet.

Wenn Sie eine einfache Zeichenfolge zurückgeben möchten, können Sie einfach das ContentResult verwenden:

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

ContentResult gibt standardmäßig einen Text/eine Ebene als contentType zurück.
Dies ist überladbar, so dass Sie auch Folgendes tun können:

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

Ich denke, Sie sollten die AcceptTypes der Anfrage berücksichtigen. Ich verwende es in meinem aktuellen Projekt, um den korrekten Inhaltstyp wie folgt zurückzugeben.

Ihre Aktion auf dem Controller kann sie wie auf dem Anforderungsobjekt testen 

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"))
{
   //
}

Sie können dann das aspx der Ansicht implementieren, um den partiellen Xhtml-Antwortfall zu berücksichtigen.

Dann können Sie es in jQuery abrufen, indem Sie den Typparameter als json übergeben:

$.get(url, null, function(data, textStatus) {
        console.log('got %o with status %s', data, textStatus);
        }, "json"); // or xml, html, script, json, jsonp or text

Ich hoffe, das hilft. James

107
James Green

Eine weitere gute Möglichkeit, mit JSON-Daten umzugehen, ist die JQuery-Funktion getJSON. Sie können das anrufen 

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

Methode aus der Jquery-Methode getJSON durch einfaches ...

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

Ich habe ein paar Probleme beim Implementieren von MVC-Ajax-GET-Aufrufen mit JQuery gefunden, die mir Kopfschmerzen bereiteten, so dass hier Lösungen geteilt wurden.

  1. Stellen Sie sicher, dass der Datentyp "Json" im Ajax-Aufruf enthalten ist. Dadurch wird das zurückgegebene JSON-Objekt automatisch analysiert (vorausgesetzt, der Server gibt gültige Json-Werte zurück).
  2. Fügen Sie den JsonRequestBehavior.AllowGet hinzu; ohne diese MVC gab ein HTTP 500-Fehler zurück (mit dataType: json auf dem Client angegeben).
  3. Fügen Sie dem Aufruf $ .ajax cache: false hinzu. Andernfalls erhalten Sie schließlich HTTP-304-Antworten (anstelle von HTTP-200-Antworten), und der Server verarbeitet Ihre Anfrage nicht.
  4. Schließlich ist der json die Groß- und Kleinschreibung, daher muss das Gehäuse der Elemente auf der Serverseite und auf der Clientseite übereinstimmen.

Beispiel 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);
  }
});

Beispiel-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);
}
44
Shane

Um die andere Hälfte der Frage zu beantworten, können Sie anrufen:

return PartialView("viewname");

wenn Sie Teil-HTML zurückgeben möchten. Sie müssen nur einen Weg finden, um zu entscheiden, ob für die Anforderung JSON oder HTML gewünscht wird, möglicherweise basierend auf einem URL-Teil/Parameter.

13
Brad Wilson

Alternative Lösung mit Incoding Framework

Aktion Rückkehr Json

Controller

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

Rasiermesser-Seite

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

Aktion gibt HTML zurück

Controller

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

Rasiermesser-Seite

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

Vielleicht möchten Sie einen Blick auf diesen sehr hilfreichen Artikel werfen, der dies sehr schön abdeckt!

Nur gedacht, es könnte den Leuten helfen, nach einer guten Lösung für dieses Problem zu suchen.

http://weblogs.asp.net/rashid/archive/2009/04/15/adaptive-rendering-in-asp-net-mvc.aspx

6
Paul Hinett

Für Leute, die auf MVC 3 aufgerüstet haben, ist dies ein ordentlicher Weg Mit MVC3 und Json

4
Sarath

PartialViewResult und JSONReuslt erben von der Basisklasse ActionResult. Wenn also der Rückgabetyp entschieden wird, deklarieren Sie die Methodenausgabe dynamisch als ActionResult.

public ActionResult DynamicReturnType(string parameter)
        {
            if (parameter == "JSON")
                return Json("<JSON>", JsonRequestBehavior.AllowGet);
            else if (parameter == "PartialView")
                return PartialView("<ViewName>");
            else
                return null;


        }
3
Anil Vaddepally
    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);
            }
        }
2
sakthi

Flexibler Ansatz zur Erzeugung unterschiedlicher Ausgaben auf Basis der Anforderung

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

Die Request.IsAjaxRequest()-Methode ist recht einfach: Sie prüft lediglich die HTTP-Header für die eingehende Anforderung, um festzustellen, ob der Wert des X-Requested-With-Headers XMLHttpRequest ist. Dieser wird von den meisten Browsern und AJAX - Frameworks automatisch angehängt.

Benutzerdefinierte Erweiterungsmethode, um zu prüfen, ob die Anforderung für Json ist oder nicht, sodass wir sie von überall aus aufrufen können, genau wie die Erweiterungsmethode "Request.IsAjaxRequest ()":

using System;
using System.Web;

public static class JsonRequestExtensions
{
  public static bool IsJsonRequest(this HttpRequestBase request)
  {
    return string.Equals(request["format"], "json");
  }
}

Quelle: https://www.safaribooksonline.com/library/view/programming-aspnet-mvc/9781449321932/ch06.html#_javascript_rendering

0
Mannan Bahelim