是否有可能做在MVC应用程序中的JavaScript文件下面?
$(function(){
alert(@ViewBag.someValue);
}
目前,它引发错误:
参考未定义的XML名称@ViewBag
是否有可能做在MVC应用程序中的JavaScript文件下面?
$(function(){
alert(@ViewBag.someValue);
}
目前,它引发错误:
参考未定义的XML名称@ViewBag
我不相信有任何当前的方式来做到这一点。 剃刀引擎并不解析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)';
不要在一个JavaScript文件,没有。
你的JavaScript文件可能包含一个类,你可以实例化的观点,即类的新实例,那么你可以通过ViewBag
在类的构造函数值。
或者,如果它不是一个类,你唯一的选择,就是用data
在你的HTML元素的属性,他们在您的视图分配到的属性和JS文件检索。
假设你有这个输入:
<input type="text" id="myInput" data-myValue="@ViewBag.MyValue" />
然后在您的JS文件,你可以用得到它:
var myVal = $("#myInput").data("myValue");
在HTML:
<input type="hidden" id="customInput" data-value = "@ViewBag.CustomValue" />
在脚本:
var customVal = $("#customInput").data("value");
为了做到这一点你的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>
标记),所以如果你发现一个漂亮的方式做到这一点,这将是很酷的,尽管也许不直观的人谁需要更高版本才能支持的代码。
创建一个视图,并返回它作为一个局部视图:
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();
}
}
希望能帮助到你。
我注意到,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注入攻击或运行时错误。
在.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>
在控制器动作添加:
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>
}