77 votes

asp.net mvc3 retourne le html brut à la vue

Existe-t-il d'autres moyens de renvoyer du html brut à partir du contrôleur ? Par opposition à l'utilisation de viewbag, comme ci-dessous :

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

@{
    ViewBag.Title = "Index";
}

@Html.Raw(ViewBag.HtmlOutput)

0 votes

J'admets qu'il y a beaucoup de raisons d'injecter le html directement, mais je suis curieux de savoir pourquoi vous l'avez fait dans ce cas ?

3 votes

J'ai un ancien code qui génère des balises à partir d'une dll.

152voto

archil Points 21369

Il n'y a pas beaucoup d'intérêt à faire ça, parce que View devrait générer le html, pas le contrôleur. Mais de toute façon, vous pouvez utiliser Méthode Controller.Content qui vous donne la possibilité de spécifier le résultat html, ainsi que le type de contenu et l'encodage.

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

Vous pouvez aussi utiliser l'astuce intégrée au cadre asp.net-mvc - faire en sorte que l'action renvoie directement une chaîne. Le contenu de la chaîne sera transmis au navigateur de l'utilisateur.

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

En fait, pour tout résultat d'action autre que ActionResult le cadre tente de le sérialiser en chaîne et de l'écrire dans la réponse.

0 votes

Je suis d'accord avec la vue qui génère du html. Mon contenu est généré à partir d'une ancienne dll. Si le contrôleur n'est pas le bon endroit pour l'invoquer, alors peut-être le modèle ?

1 votes

C'est intéressant d'utiliser un type de retour de type chaîne. Cela a-t-il toujours fonctionné ?

0 votes

Oui. Tout ce qui n'est pas ActionResult est converti en chaîne de caractères et retourne la réponse.

8voto

Adam Tuliper - MSFT Points 22478

Il suffit de créer une propriété dans votre modèle de vue de type MvcHtmlString. Vous n'aurez pas non plus besoin d'utiliser Html.Raw.

0 votes

Merci. Je n'ai pas utilisé exactement ce que vous avez dit. Ce que tu as dit m'a aidé à comprendre comment utiliser [DataType.Html]

5voto

stom Points 2477

Essayez de retour du message d'alerte du bootstrap cela a marché pour moi

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

Note : N'oubliez pas d'ajouter bootstrap css et js dans votre page d'affichage

J'espère que cela aidera quelqu'un.

2voto

Matt Points 3445

Ce qui fonctionnait pour moi (ASP.NET Core), était de définir le type de retour ContentResult puis d'y intégrer le HMTL et de définir le ContentType comme suit "text/html; charset=UTF-8" . C'est important, car, sinon, il ne sera pas interprété comme du HTML et le langage HTML sera affiché comme du texte.

Voici l'exemple, qui fait partie d'une classe de contrôleur :

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

1voto

MoXplod Points 1379

Cela semble bien, à moins que vous ne vouliez le passer en tant que chaîne Modèle

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

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

@Html.Raw(Model)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X