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.
Sie ned, um uns den Code zu zeigen, den Sie auf der Ansicht haben, ich denke, dass es davon – Massanu
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? –
@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