C# 是否可以从Javascript文件访问MVC ViewBag对象?
可以从MVC应用程序中的javascript文件执行以下操作吗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文件中检索它
$(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));