如何保持C#和Javascript代码同步?

时间:2015-04-22 16:50:15

标签: javascript c# asp.net-mvc-5 cross-platform dry

我认为这个问题可能会出现在任何人身上,我对如何充分利用技术以保持基于代码的DRY并保持同步感兴趣。

我正在开发一个ASP.NET MVC5 Web应用程序。我有几个变量需要与客户端进行通信。说“PageType”,我需要使用Google Analytics在客户端进行跟踪。意图可能是多种多样的,这是一个具有相同目的的简单应用程序,用于说明。

我有一个C#类,它允许我指定各种PageTypes,并在它们之间切换开关外壳,比如说:

public static class PageTypes {
    public const String Home = "Home";
    public const String AboutUs = "AboutUs";
    public const String ContactUs = "ContactUs";
}

当我们检查动态值时,这非常有用,例如:

String pageType = ViewBag.PageType;
if(!String.IsNullOrWhiteSpace(pageType))
{
    switch(pageType)
    {
        case PageTypes.Home:
            // do something here
            break;
        case PageTypes.AboutUs:
            // do something else here
            break;
        ...

......甚至在进行比较时。我希望你明白这一点。 因此,在Razor视图中,我可以在内联脚本的页面中输出var pageType = '@ViewBag.PageType';,并且它将在页面的内联javascript中以var pageType = 'Home';或某些内容的形式显示。 现在,就像我使用C#代码一样,我希望能够在我的javascript中切换大小写页面类型。

// This part is dynamic so will be inline script of the razor view
var pageType = 'Home';

// This part is logic so can reside in an external script

// This part is just illustration, I will worry about naming and accessibility later
// This will be in a separate script and will be included, and will be referenced, thereby providing Intellisense within Visual Studio
var PageTypes = {
    Home: 'Home',
    AboutUs: 'AboutUs'
};

// I should be able to do this, in an external script
switch(pageType){
    case PageTypes.Home:
        alert('Home!');
        break;
    case PageTypes.AboutUs:
        alert('Not Home');
        break;
    default:
        alert('Nothing');
        break;
}

可以看出,如果C#的static class PageTypes与JavaScript中的var PageTypes同步,那么对于我们的开发人员来说,使用Intellisense和预定义值会对他们带来好处,这样他们就可以了可以避免拼写错误和价值观的不兼容。

实现这一目标的最佳方法是什么,同时在C#和JavaScript中获得Intellisense?

我希望C#中的更改能够影响JS,而不是相反。不需要转换switch语句,只需像我提到的那样转换常量值。

我认为构建过程中的脚本可能很有用,但有没有任何工具/插件/替代方法来完成我提到的内容?

1 个答案:

答案 0 :(得分:0)

如果我已经明白问题是什么,你可以做的是:

  • 使用模板引擎在html标记内的某个变量中设置pagetype(抱歉,我不使用.Net,不知道如何编写它)。在这个例子中,我使用了body元素中的data- *

< body data-type =“%输出页面类型的一些模板引擎语法%”>

    在您的js中
  • ,检索数据类型值(在示例中,我使用了jquery)

    var type = $(“body”)。data(“type”);

  • 在键/对象变量/对象

    中定义一些函数,每个函数用于您的pagetype

    var PageTypeFunctions = {     home:function(){

    },
    aboutus: function() {
    
    },
    xpto: function() {
    
    }
    

    }

  • 调用该函数

    PageTypeFunctionstype;

使用这种方法,您不必处理PageTypes变量。每种页面类型只需要一个函数。当然,您可以进行一些检查以验证是否存在PageTypeFunctions [type]。