可以从JavaScript文件访问MVC ViewBag对象?可以从JavaScript文件访问MV

2019-05-13 18:23发布

是否有可能做在MVC应用程序中的JavaScript文件下面?

$(function(){
   alert(@ViewBag.someValue);
}

目前,它引发错误:

参考未定义的XML名称@ViewBag

Answer 1:

我不相信有任何当前的方式来做到这一点。 剃刀引擎并不解析JavaScript文件,只剃须刀意见。 但是,你可以完成你设置你的Razor视图中的变量想要的东西:

<script>
  var someStringValue = '@(ViewBag.someStringValue)';
  var someNumericValue = @(ViewBag.someNumericValue);
</script>
<!-- "someStringValue" and "someNumericValue" will be available in script -->
<script src="js/myscript.js"></script>

乔在评论中指出,如果有中有一个单引号的字符串值以上将打破。 如果你想使这个完全铁证如山,你就必须更换所有的单引号与转义单引号。 这个问题存在,所有的突然斜线成为一个问题。 例如,如果你的字符串是“ foo \' bar ”,并更换了单引号,有什么会出来是“ foo \\' bar ”,然后就马上回了同样的问题。 (这就是链式编码的古老的难度。)来处理这种情况的最好办法是把反斜线和引用特殊,并确保他们逃脱:

  @{
      var safeStringValue = ViewBag.someStringValue
          .Replace("\\", "\\\\")
          .Replace("'", "\\'");
  }
  var someStringValue = '@(safeStringValue)';


Answer 2:

不要在一个JavaScript文件,没有。
你的JavaScript文件可能包含一个类,你可以实例化的观点,即类的新实例,那么你可以通过ViewBag在类的构造函数值。

或者,如果它不是一个类,你唯一的选择,就是用data在你的HTML元素的属性,他们在您的视图分配到的属性和JS文件检索。

假设你有这个输入:

<input type="text" id="myInput" data-myValue="@ViewBag.MyValue" />

然后在您的JS文件,你可以用得到它:

var myVal = $("#myInput").data("myValue");


Answer 3:

在HTML:

<input type="hidden" id="customInput" data-value = "@ViewBag.CustomValue" />

在脚本:

var customVal = $("#customInput").data("value");


Answer 4:

为了做到这一点你的JavaScript文件需要在服务器端进行预处理。 从本质上讲,它会成为某种类型的ASP.NET视图, script引用该文件标签将基本上被引用其中与视图响应控制器的动作。

这听起来像是你不想打开一罐蠕虫。

由于JavaScript是客户端,为什么不将值设置为一些客户端的元素,并有JavaScript和交互的。 这也许是一个间接的额外步骤,但它听起来像是要少得多头痛不是创建一个JavaScript的看法。

事情是这样的:

<script type="text/javascript">
    var someValue = @ViewBag.someValue
</script>

然后,外部JavaScript文件可以引用someValue该文件的范围内的JavaScript变量。

甚至:

<input type="hidden" id="someValue" value="@ViewBag.someValue" />

然后你就可以访问该隐藏的输入。

除非你拿出一些真正漂亮的方式其实就是让你的JavaScript文件可以作为一个视图。 这肯定是可行的,我不能轻易想到的任何问题,你就会有(比真难看视图代码等,因为视图引擎将获得以什么的JavaScript,什么是剃刀...所以预计一迷茫<text>标记),所以如果你发现一个漂亮的方式做到这一点,这将是很酷的,尽管也许不直观的人谁需要更高版本才能支持的代码。



Answer 5:

创建一个视图,并返回它作为一个局部视图:

public class AssetsController : Controller
{
    protected void SetMIME(string mimeType)
    {
        this.Response.AddHeader("Content-Type", mimeType);
        this.Response.ContentType = mimeType;
    }

    // this will render a view as a Javascript file
    public ActionResult GlobalJS()
    {
        this.SetMIME("text/javascript");
        return PartialView();
    }
}

然后在GlobalJS视图中添加类似的JavaScript代码(添加//将Visual Studio的智能感知它读成JavaScript的)

//<script>

    $(document).ready(function () {
       alert('@ViewBag.PropertyName');
    }); 

//</script>

然后在你的最终意见,你可以参考的JavaScript就这样补充。

<script src="@Url.Action("GlobalJS", "Assets")"></script> 

然后在您的最终视图控制器,你可以创建/通过你的ViewBags,它会在你的JavaScript渲染。

public class MyFinalViewController : Controller
{
    public ActionResult Index()
    {
        ViewBag.PropertyName = "My ViewBag value!";
        return View();
    }
}

希望能帮助到你。



Answer 6:

我注意到,Visual Studio的内置错误检测,如果你尝试做这种愚蠢的获取:

var intvar = @(ViewBag.someNumericValue);

因为@(ViewBag.someNumericValue)必须评估落空的可能,这将导致以下错误的JavaScript生成:

var intvar = ;

如果你确信someNemericValue将被设置为一个有效的数字数据类型,你可以避免通过执行以下Visual Studio的警告:

var intvar = Number(@(ViewBag.someNumericValue));

这可能会产生下面的示例:

var intvar = Number(25.4);

和它的作品为负数。 在该项目是不是在你的viewbag的情况下,号码()计算结果为0。

没有更多的Visual Studio的警告! 但要确保该值设置,是数字,否则你打开大门,尽可能的JavaScript注入攻击或运行时错误。



Answer 7:

在.cshtml文件中使用此代码。

 @{
    var jss = new System.Web.Script.Serialization.JavaScriptSerializer();
    var val = jss.Serialize(ViewBag.somevalue); 
    }

    <script>
        $(function () {
            var val = '@Html.Raw(val)';
            var obj = $.parseJSON(val);
            console.log(0bj);
    });
    </script>


Answer 8:

在控制器动作添加:

 public ActionResult Index()
        {
            try
            {
                int a, b, c;
                a = 2; b = 2;
                c = a / b;
                ViewBag.ShowMessage = false;
            }
            catch (Exception e)
            {
                ViewBag.ShowMessage = true;
                ViewBag.data = e.Message.ToString();
            }
            return View();    // return View();

        }

in Index.cshtml
Place at the bottom:

<input type="hidden" value="@ViewBag.data" id="hdnFlag" />

@if (ViewBag.ShowMessage)
{
    <script type="text/javascript">

        var h1 = document.getElementById('hdnFlag');

        alert(h1.value);

    </script>
    <div class="message-box">Some Message here</div>
}


文章来源: Possible to access MVC ViewBag object from Javascript file?