asp.net mvc3 gibt rohes HTML zur Ansicht zurück


76

Gibt es andere Möglichkeiten, wie ich unformatiertes HTML vom Controller zurückgeben kann? Im Gegensatz zur Verwendung von Viewbag. Wie unten:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.HtmlOutput = "<HTML></HTML>";
        return View();
    }
}

@{
    ViewBag.Title = "Index";
}

@Html.Raw(ViewBag.HtmlOutput)

Ich gebe zu, dass es viele Gründe gibt, HTML direkt zu injizieren, aber ich war neugierig, warum Sie in diesem Fall waren?
Rikon

3
Ich habe einen alten Code, der Markup aus einer DLL generiert.
Fluss

Antworten:


149

Das macht nicht viel Sinn, denn es Viewsollte HTML generiert werden, nicht der Controller. Sie können jedoch die Controller.Content-Methode verwenden , mit der Sie das Ergebnis-HTML sowie den Inhaltstyp und die Codierung angeben können

public ActionResult Index()
{
    return Content("<html></html>");
}

Oder Sie können den im asp.net-mvc-Framework integrierten Trick verwenden - lassen Sie die Aktion direkt zurückgeben. Es liefert String-Inhalte in den Browser des Benutzers.

public string Index()
{
    return "<html></html>";
}

Tatsächlich ActionResultversucht das Framework für jedes andere Aktionsergebnis als , es in eine Zeichenfolge zu serialisieren und in die Antwort zu schreiben.


Ich bin mit der Erstellung von HTML einverstanden. Mein inhaltlicher Gedanke wird aus einer Legacy-DLL generiert. Wenn der Controller nicht der richtige Ort zum Aufrufen ist, dann vielleicht das Modell?
Fluss

1
Das ist interessant bei der Verwendung eines String-Typs vom Typ return. Hat das immer funktioniert?
Matthew Nichols

Ja. Alles, was nicht ActionResult ist, wird in einen String konvertiert und gibt eine Antwort zurück
archil

Gibt es eine Möglichkeit, es als zurückzugeben PartialViewResult?
Shimmy Weitzhandler

3
Wenn Sie sicherstellen möchten, dass es als HTML gerendert wird, fügen Sie den zweiten Parameter hinzu:return Content("<html></html>", "text/html");
Grengas

8

Erstellen Sie einfach eine Eigenschaft in Ihrem Ansichtsmodell vom Typ MvcHtmlString. Sie müssen es dann auch nicht Html.Raw.


Vielen Dank. Ich habe nicht genau das verwendet, was du gesagt hast. Was Sie gesagt haben, hat mir geholfen, mit [DataType.Html]
Dexter

5

Versuchen Sie, die Bootstrap-Warnmeldung zurückzugeben . Dies hat bei mir funktioniert

return Content("<div class='alert alert-success'><a class='close' data-dismiss='alert'>
&times;</a><strong style='width:12px'>Thanks!</strong> updated successfully</div>");

Hinweis: Vergessen Sie nicht, Bootstrap cssund jsauf Ihrer Ansichtsseite hinzuzufügen

Hoffnung hilft jemandem.


Danke, es hat mir wirklich geholfen :)
Rentire

1

Das sieht gut aus, es sei denn, Sie möchten es als Modellzeichenfolge übergeben

public class HomeController : Controller
{
    public ActionResult Index()
    {
        string model = "<HTML></HTML>";
        return View(model);
    }
}

@model string
@{
    ViewBag.Title = "Index";
}

@Html.Raw(Model)

0

Was für mich (ASP.NET Core) funktionierte, war, den Rückgabetyp ContentResultfestzulegen, dann die HMTL darin zu verpacken und den ContentType auf zu setzen"text/html; charset=UTF-8" . Dies ist wichtig, da es sonst nicht als HTML interpretiert wird und die HTML-Sprache als Text angezeigt wird.

Hier ist das Beispiel einer Controller-Klasse:

/// <summary>
/// Startup message displayed in browser.
/// </summary>
/// <returns>HTML result</returns>
[HttpGet]
public ContentResult Get()
{
    var result = Content("<html><title>DEMO</title><head><h2>Demo started successfully."
      + "<br/>Use <b><a href=\"http://localhost:5000/swagger\">Swagger</a></b>"
      + " to view API.</h2></head><body/></html>");
    result.ContentType = "text/html; charset=UTF-8";
    return result;
}

-1
public ActionResult Questionnaire()
{
    return Redirect("~/MedicalHistory.html");
}

4
Bitte beschreiben Sie in Ihrer Antwort, was das Problem war und wie dieses Snippet es lösen wird, um anderen zu helfen, diese Antwort zu verstehen
Slideshowp2

-2

In Controller können Sie verwenden MvcHtmlString

public class HomeController : Controller
{
    public ActionResult Index()
    {
        string rawHtml = "<HTML></HTML>";
        ViewBag.EncodedHtml = MvcHtmlString.Create(rawHtml);
        return View();
    }
}

In Ihrer Ansicht können Sie einfach die dynamische Eigenschaft verwenden, die Sie wie unten in Ihrem Controller festgelegt haben

<div>
        @ViewBag.EncodedHtml
</div>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.