2016-07-14 5 views
2

Ich habe den einfachen Code, mit dem ich versuche, ein Listenobjekt von einer Controller-Methode zurückzugeben und es im Browser anzuzeigen. Stattdessen Browser zeigt die Art der Liste als:Controller gibt den Typnamen des Listenobjekts anstelle des Inhalts in der Liste zurück

System.Collections.Generic.List`1[System.String] 

Unten finden Sie meine Code:

Controller:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Net; 
using System.Web.Http; 
using System.Web.Script.Serialization; 
using MvcApplication2.Models; 
using Newtonsoft.Json; 

namespace MvcApplication2.Controllers 
{ 
    public class CodesController : Controller 
    { 
     WebClient myclient = new WebClient(); 

     public IEnumerable<Codes> Get() 
     { 
      string data = myclient.DownloadString("URL"); 
      List<Codes> myobj = (List<Codes>)JsonConvert.DeserializeObject(data, typeof(List<Codes>)); 
      return myobj; 
     } 
    } 
} 

Datenmodell:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace MvcApplication2.Models 
{ 
    public class Codes 
    { 
     public string hr { get; set; } 
     public string ps { get; set; } 
    } 
} 

Kann jemand bitte lassen Sie mich wissen, wo Ich möchte, dass diese Codes in der Testliste anstelle des Typsim Browser angezeigt werden 10. Ich bin sehr neu in MVC, ist es möglich, einfache Liste zurückzugeben und es im Browser vom Controller rendern, anstatt eine Ansicht zu verwenden.

+0

Sie ned, um uns den Code zu zeigen, den Sie auf der Ansicht haben, ich denke, dass es davon – Massanu

+0

kommt Sie können den Controller mit Controller apiController verwirren, aber ich bin nicht sicher. Kannst du das größere Bild von dem, was du erreichen willst, erklären? –

+0

@Massanu danke für die Antwort, ich habe keine Ansicht hinzugefügt. Ich versuche, diese Liste vom Controller zurückzugeben. Ist es möglich, von der Steuerung zurückzukehren. – Agasthya

Antwort

4

Controller-Aktionen sollen keine POCO-Objekte zurückgeben. Sie würden besser die Instanz einer Klasse zurückgeben, die von ActionResult geerbt wurde, die dafür verantwortlich ist, Ihr tatsächliches Ergebnis in HTML in gewünschter Weise darzustellen. Wenn Sie beispielsweise eine Ansicht ausführen und HTML rendern möchten, verwenden Sie die Methode Controller.View, die ViewResult zurückgibt.

Es ist nicht klar, wie Sie Ihre Sammlung darstellen möchten, aber ich denke, es könnte JSON sein. In diesem Fall können Sie die Standardmethode Controller.Json verwenden oder some custom die Implementierung ActionResult zurückgeben.

Wenn Sie etwas, das nicht vererbt von ActionResult zurückgegeben wird, wird asp.net mvc versuchen, es in string konvertieren und konvertierte Zeichenfolge als Nur-Text ohne jede Änderung zurückgegeben. Diese Methode von ControllerActionInvoker Klasse verantwortlich für die Handhabung, was Sie in Ihren Aktionen zurückgeben. Weitere Code nur mit ActionResult Nachfolgern arbeiten so, wenn Sie nicht einer von ihnen zurückkehren, wird es umgesetzt:

/// <summary>Creates the action result.</summary> 
/// <returns>The action result object.</returns> 
/// <param name="controllerContext">The controller context.</param> 
/// <param name="actionDescriptor">The action descriptor.</param> 
/// <param name="actionReturnValue">The action return value.</param> 
protected virtual ActionResult CreateActionResult(ControllerContext controllerContext, ActionDescriptor actionDescriptor, object actionReturnValue) 
{ 
    if (actionReturnValue == null) 
    return new EmptyResult(); 
    var actionResult = actionReturnValue as ActionResult; 
    if (actionResult == null) 
    { 
    actionResult = new ContentResult() 
    { 
     Content = Convert.ToString(actionReturnValue, (IFormatProvider) CultureInfo.InvariantCulture) 
    }; 
    } 
    return actionResult; 
} 

Typ List nicht ToString Methode überschreibt, so ist es Standardimplementierung ist vollständigen Typnamen zurückzukehren. In Ihrem Fall ist es System.Collections.Generic.List`1[System.String].

Probieren Sie etwas wie folgt aus:

public class CodesController : Controller 
{ 
    public ActionResult GetListJson() 
    { 
     var list = new List<string> { "AA", "BB", "CC" }; 
     return this.Json(list , JsonRequestBehavior.AllowGet); 
    } 

    public ActionResult GetListText() 
    { 
     var list = new List<string> { "AA", "BB", "CC" }; 
     return this.Content(string.Join(",", list)); 
    } 

    public ActionResult GetListView() 
    { 
     var list = new List<string> { "AA", "BB", "CC" }; 
     return this.View(list); 
    } 
} 

Erste Methode Anwendung zurück/json: ["AA", "BB", "CC"]

Zweite Methode text/plain zurück: AA,BB,CC

dritte Methode zurückkehren text/html, aber Sie müssen Ansichtsnamen erstellen d GetListView.cshtml:

@using System.Collections.Generic.List<string> 
<!DOCTYPE html> 
<html> 
<head> 
    <title>page list</title> 
</head> 
<body> 
    @foreach(var item in this.Model) 
    { 
     <p>@item</p> 
    } 
</body> 
</html> 

aktualisieren nach Ihren Anmerkungen, die Sie gerade einen Text zurückkehren möchten. Siehe Code unten. Es wird zurückgeben, was Sie wollen: [AA,BB],[AA,BB],[AA,BB]. Beachten Sie den Ergebnistyp und die Notwendigkeit der manuellen Datenserialisierung.

public ActionResult Get() 
{ 
    string data = myclient.DownloadString("URL"); 
    List<Codes> myobj = (List<Codes>)JsonConvert.DeserializeObject(data, typeof(List<Codes>)); 

    // Let's convert it into what you want. 
    var text = string.Join(",", list.Select(x => string.Format("[{0},{1}]", x.hr, x.ps))); 
    return this.Content(text); 
} 

Alternativ können Sie erstellen eigene ActionResult:

public class CodesResult : ActionResult 
{ 
    private readonly List<Codes> _list; 

    public CodesResult(List<Codes> list) 
    { 
     this._list = list; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
      throw new ArgumentNullException("context"); 

     var response = context.HttpContext.Response; 

     response.ContentType = "text/plain"; 
     if (this._list != null) 
     { 
      // You still have to define serialization 
      var text = string.Join(",", this._list.Select(x => string.Format("[{0},{1}]", x.hr, x.ps))); 
      response.Write(text); 
     } 
    } 
} 

Und dann verwenden:

public ActionResult Get() 
{ 
    string data = myclient.DownloadString("URL"); 
    List<Codes> myobj = (List<Codes>)JsonConvert.DeserializeObject(data, typeof(List<Codes>)); 
    return new CodesResult(myobj); 
} 

Ich weiß nicht, was Sie Aufgabe ist und warum Sie benutzerdefinierte zurückgeben müssen einfacher Text. Ich würde jedoch empfehlen, Newtonsoft-based JsonNetResult from this answer zu verwenden. Mit Absicht aktiviert wird es ziemlich lesbare JSON produzieren. Es ist auch sehr einfach, es für jede Art von Komplexität wiederzuverwenden.

Auch, wenn Sie Daten, keine GUI und so weiter zurückgeben müssen, werfen Sie einen Blick auf ASP.NET Web API.

+0

@Iorond Ich versuche, eine JSON-Zeichenfolge zu dem Listenobjekt zu deserialisieren und es im Browser anzuzeigen. Ich habe diese JSON-Zeichenfolge wie folgt: [{"hr": "AA", "PS": "BB"}, {"hr": "AA", "PS": "BB"}, {"hr": "AA", "PS": "BB"}, {"hr": "AA", "PS": "BB"}] und ich habe diesen obigen String mithilfe der Jsonconvert.deserialize-Methode in die Liste deserialisiert und möchte diese Liste auf angezeigt werden wie folgt: [AA, BB], [AA, BB], [AA, BB]. – Agasthya

+0

@SwethaD Sie deserialisieren es in welchen Typ? Wie soll es in den Browser zurückkehren? Als HTML, JSON, Klartext? Oder irgendwie anders? Sie würden besser vollständigen Code zeigen. – lorond

+0

@Iorond Ich deserialized in Liste Objekt, möchte ich es als Klartext wie folgt zurückgeben: [AA, BB], [AA, BB], [AA, BB] .. – Agasthya

Verwandte Themen