asp.net mvc 3-在mvc Razor中共享C#和Javascript之间的常量
asp.net mvc 3 - Share constants between C# and Javascript in MVC Razor
我想在服务器上的C#和客户端上的Javascript中同时使用字符串常量。我将常量封装在C#类中
namespace MyModel
{
public static class Constants
{
public const string T_URL = "url";
public const string T_TEXT = "text";
. . .
}
}
我找到了一种使用Razor语法在Javascript中使用这些常量的方法,但对我来说很奇怪:
@using MyModel
<script type="text/javascript">
var T_URL = '@Constants.T_URL';
var T_TEXT = '@Constants.T_TEXT';
. . .
var selValue = $('select#idTagType').val();
if (selValue == T_TEXT) { ...
在C#和Javascript之间还有更"优雅"的共享常量的方式吗?(或者至少更自动,这样我就不必在两个文件中进行更改)
使用它的方式很危险。想象一下,您的一些常量包含一个引号,或者更糟的是,其他一些危险的字符=>会破坏您的java脚本。
我建议您编写一个控制器操作,将所有常量作为javascript:
public ActionResult Constants()
{
var constants = typeof(Constants)
.GetFields()
.ToDictionary(x => x.Name, x => x.GetValue(null));
var json = new JavaScriptSerializer().Serialize(constants);
return JavaScript("var constants = " + json + ";");
}
然后在你的布局参考这个脚本:
<script type="text/javascript" src="@Url.Action("Constants")"></script>
现在,每当你在脚本中需要一个常量时,只需使用它的名称:
<script type="text/javascript">
alert(constants.T_URL);
</script>
您可以使用HTML助手来输出必要的脚本,并使用反射来获取字段及其值,这样它就会自动更新。
public static HtmlString GetConstants(this HtmlHelper helper)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.AppendLine("<script type='"text/javascript'">");
foreach (var prop in typeof(Constants).GetFields())
{
sb.AppendLine(string.Format(" var {0} = '{1}'", prop.Name, prop.GetValue(null).ToString()));
}
sb.AppendLine("</script>");
return new HtmlString(sb.ToString());
}
与其将常量数据存储在C#类中,不如将其存储在静态配置/常量文件中。
// Constants.json
{
"T_URL": "url",
"T_TEXT": "text"
}
// Constants.cs
// load the json from a file stream into a constants object
// Constants.js
window.Constants = $.getJSON(url);
只需将其存储为某种文件格式(json、xml、cvs等),然后从客户端和;服务器
这意味着,您可以在运行时使用black magic反射在C#中动态创建一个类,或者只在键下有一个包含常量的哈希表/字典。
jQuery.getJSON
、JsonReaderWriterFactor
我的版本是从我的C#常量创建一个名称空间的javascript对象,它是不可变的:
public static HtmlString GetConstants<T>()
{
StringBuilder jsConstant = new StringBuilder();
jsConstant.Append("myApp." + typeof(T).Name + " = Object.freeze({");
foreach(var item in typeof(T).GetFields())
{
jsConstant.Append(string.Format("{0}:'{1}'",item.Name,item.GetValue(null).ToString()) + ",");
}
jsConstant.Remove(jsConstant.Length - 1, 1);
jsConstant.Append("})");
return new HtmlString(jsConstant.ToString());
}
像这样在Razor:中使用
@(HtmlHelpers.GetConstants<MyApp.Infrastructure.ApplicationConstants.SomeConstants>())
另一个选项是将常量作为data-
值添加到调用JavaScript代码的按钮/链接中。
您的观点:
<button data-url="@T_URL" ...>
您的脚本:
$('button').click(function(event) {
var url = $(this).data('url');
...
相关文章:
- 如何将Spring MVC Javascript模板引擎与双节棍集成
- 如何在C#MVC/Javascript中的运行时添加一个空实体
- WebStorm ASP.NET MVC JavaScript Debugging
- mvc Javascript文件更改后未更新
- MVC/Javascript:如何在表单提交中发布整数数组
- MVC Javascript基于模型设置文本输入值
- MVC-JavaScript翻译中字符串的全球化
- ASP.NET MVC Javascript重定向编码问题
- ASP.NET MVC Javascript在页面加载时未首次启动
- Asp.Net MVC JavaScript加载页面后不工作
- 使用MVC/Javascript实现回合制网页游戏
- MVC javascript回发前确认不工作
- MVC javascript方法调用未打开excel保存对话框
- MVC Javascript DateTime
- 我应该为这个应用程序使用MVC javascript框架吗?
- 用mvc javascript中的数据填充下拉列表
- MVC JavaScript's窗口.打开添加到url
- 在MVC javascript中解析@
- 加载资源失败:服务器响应状态为500(内部服务器错误)MVC JAVASCRIPT
- MVC JavaScript代码不工作