ASP.NET:在JavaScript代码中设置C#变量

Enr*_*ico 3 javascript c# asp.net web-applications

我正在使用ASP.NET C#,并且在我的viewsAll.cshtmli中有一个JavaScript
,用于检测用户是否使用Internet Explorer.
alert("Other Browser");或者alert("Internet Explorer");是工作的罚款.

问题是c#代码行都是executet:
@{ Session["BrowserName"] = "IE";}@{Session["BrowserName"] = "other";}

但在我使用Internet Explore的情况下,它应该只执行
@{ Session["BrowserName"] = "IE";}

viewsAll.cshtml:

<script>
 var usera = window.navigator.userAgent;
 var ie = usera.indexOf("IE ");

 if(ie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./))  // If Internet Explorer
 {    
  alert("Internet Explorer");
  $('head').append('<link href="@Url.Content("~")Content/Styles/styleForIE.css" rel="stylesheet" />');
  @{ Session["BrowserName"] = "IE";}
 }
 else{  // If Other Browser
    alert("Other Browser");
    $('head').append('<link href="@Url.Content("~")Content/Styles/styleForOther.css" rel="stylesheet" />');
    @{Session["BrowserName"] = "other";}
}
</script>
Run Code Online (Sandbox Code Playgroud)

Chr*_*Fin 6

你在这里混淆了服务器端代码和客户端代码错误的概念:
所有C#代码总是在服务器端执行,即使它在客户端条件块中.
这意味着你的两个@{ Session["BrowserName"] = "XX"; }代码块总是在服务器上执行而不仅仅是适当的代码块,因为这两个块只是"客户端条件" - 在服务器上它们只是"文本".

您应该/可以做的是在服务器端评估中转换条件并检查服务器上的用户代理:

<script>
    @if(Request.UserAgent.Contains("IE ") || new Regex(@"Trident.*rv\:11\.").Match(Request.UserAgent).Success)
    {    
        Session["BrowserName"] = "IE";
        <text>
            alert("Internet Explorer");
            $('head').append('<link href="@Url.Content("~")Content/Styles/styleForIE.css" rel="stylesheet" />');
        </text>
    }
    else
    {
        Session["BrowserName"] = "other";
        <text>
            alert("Other Browser");
            $('head').append('<link href="@Url.Content("~")Content/Styles/styleForOther.css" rel="stylesheet" />');
        </text>
    }
</script>
Run Code Online (Sandbox Code Playgroud)