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?

4
  • 1
    When you say it's "just writing plain text instead", is it to be understood that it's sending Content-Type as text/plain? Commented Aug 14, 2019 at 7:24
  • Yeah, that's correct! @John Commented Aug 14, 2019 at 7:30
  • 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> Commented Aug 14, 2019 at 8:33
  • Yes, that is an alternative way and currently implemented the same. However, we won't have view page anymore Commented Aug 14, 2019 at 8:36

2 Answers 2

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";
    }
}
Sign up to request clarification or add additional context in comments.

Comments

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");
}`

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.