80

Are there other ways I can return raw html from controller? As opposed to just using viewbag. like below:

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

@{
    ViewBag.Title = "Index";
}

@Html.Raw(ViewBag.HtmlOutput)
Matt
  • 25,467
  • 18
  • 120
  • 187
River
  • 1,487
  • 3
  • 15
  • 25

7 Answers7

156

There's no much point in doing that, because View should be generating html, not the controller. But anyways, you could use Controller.Content method, which gives you ability to specify result html, also content-type and encoding

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

Or you could use the trick built in asp.net-mvc framework - make the action return string directly. It will deliver string contents into users's browser.

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

In fact, for any action result other than ActionResult, framework tries to serialize it into string and write to response.

archil
  • 39,013
  • 7
  • 65
  • 82
8

Simply create a property in your view model of type MvcHtmlString. You won't need to Html.Raw it then either.

Valamas
  • 24,169
  • 25
  • 107
  • 177
Adam Tuliper
  • 29,982
  • 4
  • 53
  • 71
  • Thank you. Didn't use exactly what you said. What you said helped me figure out using [DataType.Html] – Dexter Oct 07 '14 at 17:10
6

Give a try to return bootstrap alert message, this worked for me

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: Don't forget to add bootstrap css and js in your view page

hope helps someone.

Shaiju T
  • 6,201
  • 20
  • 104
  • 196
5

What was working for me (ASP.NET Core), was to set return type ContentResult, then wrap the HMTL into it and set the ContentType to "text/html; charset=UTF-8". That is important, because, otherwise it will not be interpreted as HTML and the HTML language would be displayed as text.

Here's the example, part of a Controller class:

/// <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;
}
Matt
  • 25,467
  • 18
  • 120
  • 187
2

That looks fine, unless you want to pass it as Model string

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

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

@Html.Raw(Model)
MoXplod
  • 3,813
  • 6
  • 36
  • 46
-1
public ActionResult Questionnaire()
{
    return Redirect("~/MedicalHistory.html");
}
  • 4
    Please describe in your answer, what was the problem, and how will this snippet solve it, to help others understand this answer – Lin Du Nov 06 '19 at 04:20
-2

In controller you can use MvcHtmlString

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

In your View you can simply use that dynamic property which you set in your Controller like below

<div>
        @ViewBag.EncodedHtml
</div>
David Ansermot
  • 6,052
  • 8
  • 47
  • 82
waris kantroo
  • 83
  • 3
  • 21