1

在下面的 MVC 视图代码中,isLoggedInDb 带有绿色下划线,工具提示显示Expected ';' . 显然有一个;,而且很难用谷歌搜索; 在它的上面。我已经看到其他人在以这种方式创建 JavaScript 服务器端时遇到问题,所以这可能不是最佳实践。应该忽略这一点,还是 Intellisense 有正当理由抱怨?

@* SHTML Code Above *@

<script type="text/javascript">
    @{  
        string isLoggedInDb;

        if(Session["isLoggedInDb"] != null)
        {
            if(Session["isLoggedInDb"].ToString() == "1") 
            {
                isLoggedInDb = "1";
            }
            else
            {
                isLoggedInDb = "0";
            }
        }
    }

    var dblogin=@(isLoggedInDb);

    @*....etc*@

    }

编辑

我突然想到,以编程方式构建 JavaScript 可能不是最好的主意,因为将 JavaScript 保存在通常被缓存的单独文件中可能被认为是最佳实践。我认为我应该在 JavaScript 读取的 HTML 中编写隐藏变量。也许有人可以证实这一点。

4

3 回答 3

2

毫无疑问,您应该采取类似于以下方法的方法:

var isLoggedOn = @Model.IsLoggedInDb

IsLoggedInDb 应该是您的 ViewModel 的一部分,您的 View 不应该检查会话,这非常脆弱,不易测试,控制器的目的是为表示层(视图)编排数据

于 2012-06-16T07:20:28.807 回答
2

我不是 100% 确定,但我认为编译器将其视为 C# 代码,因为您将它放在 Razor 代码块中@{ }

尝试这个:

<script type="text/javascript">
    string isLoggedInDb;

    @if(Session["isLoggedInDb"] != null)
    {
        if(Session["isLoggedInDb"].ToString() == "1") 
        {
            <text>isLoggedInDb = "1";</text>
        }
        else
        {
            <text>isLoggedInDb = "0";</text>
        }
    }
</script>

至于在服务器上构建JS,我个人是受不了的(我不喜欢合并任何client/server/css代码)。我无法谈论它的性能,但我可以说你正在为一个噩梦般的维护场景做准备,跟踪所有 JS 的来源,更不用说你失去了轻松调试和管理脚本的能力。

于 2012-06-16T00:55:04.613 回答
1

代码应该按原样工作,但是 Razor Parser 正在与 javascript 智能感知作斗争,因此您可能希望将所有 C# 代码逻辑移出脚本标签,因为它不需要在里面,如下所示:

@{  
        string isLoggedInDb;

        if(Session["isLoggedInDb"] != null)
        {
            if(Session["isLoggedInDb"].ToString() == "1") 
            {
                isLoggedInDb = "1";
            }
            else
            {
                isLoggedInDb = "0";
            }
        }
    }

 @*....etc*@

<script type="text/javascript">

    var dblogin=@(isLoggedInDb);


..etc..
</script>
于 2012-06-16T00:57:56.593 回答