Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以从Javascript文件访问MVC ViewBag对象?_C#_Jquery_Asp.net Mvc_Asp.net Mvc 3_Razor - Fatal编程技术网

C# 是否可以从Javascript文件访问MVC ViewBag对象?

C# 是否可以从Javascript文件访问MVC ViewBag对象?,c#,jquery,asp.net-mvc,asp.net-mvc-3,razor,C#,Jquery,Asp.net Mvc,Asp.net Mvc 3,Razor,可以从MVC应用程序中的javascript文件执行以下操作吗 $(function(){ alert(@ViewBag.someValue); } 当前它抛出错误: 对未定义的XML名称@ViewBag的引用 不在JavaScript文件中,否。 您的JavaScript文件可以包含一个类,您可以在视图中实例化该类的新实例,然后可以在类构造函数中传递ViewBag值 或者,如果它不是一个类,您唯一的另一种选择是在HTML元素中使用数据属性,将它们分配给视图中的属性,并在JS文件中检索它

可以从MVC应用程序中的javascript文件执行以下操作吗

$(function(){
   alert(@ViewBag.someValue);
}
当前它抛出错误:

对未定义的XML名称@ViewBag的引用


不在JavaScript文件中,否。
您的JavaScript文件可以包含一个类,您可以在视图中实例化该类的新实例,然后可以在类构造函数中传递
ViewBag

或者,如果它不是一个类,您唯一的另一种选择是在HTML元素中使用
数据
属性,将它们分配给视图中的属性,并在JS文件中检索它们

假设您有此输入:

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

我认为目前没有任何方法可以做到这一点。Razor引擎不解析Javascript文件,只解析Razor视图。但是,您可以通过在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>

为了做到这一点,您的JavaScript文件需要在服务器端进行预处理。本质上,它必须成为某种ASP.NET视图,引用该文件的
script
标记实质上是引用一个控制器动作,该动作用该视图进行响应

这听起来像是一罐你不想打开的虫子

既然JavaScript是客户端的,为什么不将值设置为某个客户端元素并让JavaScript与之交互呢。这可能是间接寻址的另一个步骤,但听起来不像创建JavaScript视图那么令人头痛

大概是这样的:

<script type="text/javascript">
    var someValue = @ViewBag.someValue
</script>
然后您可以访问隐藏的输入


除非你想出了一些非常巧妙的方法,让你的JavaScript文件可以作为一个视图使用。这当然是可行的,而且我不容易想到你会遇到任何问题(除了非常难看的视图代码,因为视图引擎会对什么是JavaScript和什么是Razor感到非常困惑…所以期待大量的
标记),所以如果你找到一种巧妙的方法来做这件事,那将非常酷,尽管对以后需要支持代码的人来说可能不太直观。

在Html中:

<input type="hidden" id="customInput" data-value = "@ViewBag.CustomValue" />
var customVal = $("#customInput").data("value");

创建视图并将其作为局部视图返回:

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 intellisense将其作为java脚本读取)


希望有帮助。

我注意到,如果您尝试这样做,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中,则Number()的计算结果为0


没有更多的Visual Studio警告!但请确保该值已设置且为数字,否则可能会导致JavaScript注入攻击或运行时错误。

在控制器操作中添加:

 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>
}
public ActionResult Index()
{
尝试
{
INTA、b、c;
a=2;b=2;
c=a/b;
ViewBag.ShowMessage=false;
}
捕获(例外e)
{
ViewBag.ShowMessage=true;
ViewBag.data=e.Message.ToString();
}
返回视图();//返回视图();
}
在Index.cshtml中
在底部放置:
@如果(ViewBag.ShowMessage)
{
var h1=document.getElementById('hdnFlag');
警报(h1值);
这里有消息吗
}

在.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>
@{
var jss=new System.Web.Script.Serialization.JavaScriptSerializer();
var val=jss.Serialize(ViewBag.somevalue);
}
$(函数(){
var val='@Html.Raw(val)';
var obj=$.parseJSON(val);
控制台日志(0bj);
});

对于CoreMVC 3.1来说

@using Newtonsoft.Json
var listInJs =  @Html.Raw(JsonConvert.SerializeObject(ViewBag.SomeGenericList));

onclick=“myFunction('@ViewBag.MyValue')”

我以前问过一个类似的问题,希望它能帮助您。tl;dr of it是:使用数据属性在视图中设置值,然后使用jQuery访问单独的.JS文件中的数据属性。+1-这是最广泛接受的方法,也是我自己使用的方法。请小心地将viewbag数据存储在html元素中,具体取决于数据类型和正在构建的应用程序类型,这可能是一个严重的安全漏洞。在某些情况下,通过将一些逻辑从javascript移动到控制器,可能值得重新构造。(只有一些案例,比如我自己的案例!):)回答得不错!如果数据myValue的内容包含HTML特殊字符,则可能需要进行一些编码或转义如果ViewBag.someStringValue中只有一个引号,这不会破坏js吗?我认为正确的方法是使用一个隐藏的表单字段(如下面的答案所示)。这是一个很好的观点,Joe,你是对的:一个引用确实会把事情搞砸。我觉得隐藏表单字段方法非常笨拙,但这更直接。而且单引号问题很容易处理…我会相应地更新我的答案,谢谢你的提示。我认为如果在以前的版本中可以做到这一点,就不需要bracketsIdk,但是你可以直接在警报中键入“@(ViewBag.someStringValue)”(不使用变量)谢谢,我想,
.Replace(“'”,“\\”);
可能必须是:
.Replace(“'”,“\'”);
要复制异常集b=0,这样弹出窗口就会显示出来。必须选择该选项作为答案。投票+
var intvar = ;
var intvar = Number(@(ViewBag.someNumericValue));
var intvar = Number(25.4);
 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>
}
 @{
    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>
@using Newtonsoft.Json
var listInJs =  @Html.Raw(JsonConvert.SerializeObject(ViewBag.SomeGenericList));