How to return JavaScript from controller?
Asked Answered
F

2

9

I'm working with the ASP.NET Core 2.2 project where I need to return JavaScript from the controller. However, I suspect that there is no direct way, hence, I followed this OS answer and changed my code as following:

public IActionResult MyAction()
{
    var sb = new StringBuilder();
    sb.Append("$(document).ready(function(){");
    sb.Append("alert('hi')");
    sb.Append("});");            
    return new JavaScriptResult(sb.ToString());
}

public class JavaScriptResult : ContentResult
{
    public JavaScriptResult(string script)
    {
        this.Content = script;
        this.ContentType = "application/javascript";
    }
}

Though it's just writing plain text instead. Is there way around?

Fluoric answered 14/8, 2019 at 7:15 Comment(4)
When you say it's "just writing plain text instead", is it to be understood that it's sending Content-Type as text/plain?Carven
Yeah, that's correct! @JohnFluoric
Based on your implementation, i can assume that you want the script to be executed when the controller method is called. If i'm right then it would make more sense if you pass the script via a ViewData obect and reference from your view page like: Controller: ViewData["sayhello"] = "alert('hello');" then from View: head tag <script>@Html.Raw(ViewData["sayhello"].ToString())</script>Lengthwise
Yes, that is an alternative way and currently implemented the same. However, we won't have view page anymoreFluoric
E
11

You can use ajax to load the javascript , in your page :

<script>
    $(function () {
            $.getScript("/Controller/Action");
    });

</script>

Your serve side :

public IActionResult DoSomething()
{
    return new  JavaScriptResult("alert('Hello world!');");
}

public class JavaScriptResult : ContentResult
{
    public JavaScriptResult(string script)
    {
        this.Content = script;
        this.ContentType = "application/javascript";
    }
}
Elijah answered 14/8, 2019 at 7:50 Comment(0)
E
2

You need to add a second parameter Content-type and return "Content" instead of JavaScriptResult:

`public IActionResult MyAction()
{
  var sb = new StringBuilder();
  sb.Append("$(document).ready(function(){");
  sb.Append("alert('hi')");
  sb.Append("});");            
  return Content(sb.ToString(), "text/html");
}`
Eglantine answered 11/8, 2021 at 15:37 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.