2

我已经阅读了很多线程,但我无法弄清楚为什么这不起作用。我正在创建一个用作导航栏的 SharePoint Web 部件。一切都很好,直到我尝试在 JS 代码中引用一个 C# 变量。

这是我在 VisualWebPart1UserControl.ascx.cs 中的 C#:

    public class myClass
    {

        public string theValue = "hi";


    }

这是来自 VisualWebPart1UserControl.ascx 页面的 HTML/JS:

    <script type="text/javascript">
function getMyValue() {

    var myVar = "<%= myClass.theValue %>";

    alert(myVar);
}

<li><a href="http://maindt" 
    onmouseover="getMyValue(), mopen('m1')"
    onmouseout="mclosetime()">MAINDT Home</a>
    <div id="m1" 
        onmouseover="mcancelclosetime()"
        onmouseout="mclosetime()">
    <a href="">Site 1</a>
    <a href="">Site 2</a>
    <a href="">Site 3</a>
    </div>
</li>

发生的情况是,当我将鼠标悬停在“MaindDT Home”下拉菜单上时,我得到了很好的警报(myVar),但是当我期望它显示值时,内容是 <%=myClass.theValue%> "Hi" 的值

4

5 回答 5

3

问题是——如果你试图在一个单独的 js 文件中存储/访问你的变量——你根本做不到;aspx 解析器没有在 js/css 文件上运行。

这是我的做法:

您单独的 javascript 文件应如下所示:

   // added a few parameters (id should be something like 'm1')
   function getMyValue(id, value)
   {
       alert(value); 
   }

您的 ascx 文件应包含以下内容:

<!-- add a reference to the js file -->
<script type="text/javascript" src="myJavascriptFile.js"></script>

<%
    // in order for this to work:
    // it requires a field/property of type myClass within your page or theValue should be a static  property/field of myClass 

    // create an instance of myClass (or get it another way...)
    var myClassInstance = new myClass();

    // create a simple reference to the value you want (not required - but makes it a bit more readable)
    var myValue = myClassInstance.theValue;

    // I'm injecting myValue as a parameter for the javascript function (this gets printed as a string - so make sure you encode it properly)
%>      
<li><a href="http://maindt" 
    onmouseover="getMyValue('m1', '<%: myValue %>'); mopen('m1');"
    onmouseout="mclosetime()">MAINDT Home</a>
    <div id="m1" 
        onmouseover="mcancelclosetime()"
        onmouseout="mclosetime()">
    <a href="">Site 1</a>
    <a href="">Site 2</a>
    <a href="">Site 3</a>
    </div>
</li>

有点晚了,但我希望这会有所帮助!

于 2013-07-04T21:01:12.887 回答
2

这里的例子:

VisualWebPart1UserControl.ascx

 <script>
     function getMyValue() {
           var myVar = <%=new JavaScriptSerializer().Serialize(this.theValue) %>';
           alert(myVar); 
     }
 </script>
 <li><a href="http://maindt" 
        onmouseover="getMyValue('m1'), mopen('m1')"
        onmouseout="mclosetime()">MAINDT Home</a>
        <div id="m1" 
            onmouseover="mcancelclosetime()"
            onmouseout="mclosetime()">
               <a href="">Site 1</a>
               <a href="">Site 2</a>
               <a href="">Site 3</a>
        </div>
 </li>

注意,JavaScriptSerializer 用于正确地将数据转义为 javascript。这也允许安全地传递空值、布尔值、带有 (". ', \n) 符号或对象的字符串。作为替代方案,您可以使用其他 json 序列化程序。

如果您的数据不需要转义,则只需编写 '<%=this.theValue %>'

VisualWebPart1UserControl.ascx.cs:

public class VisualWebPart1UserControl: WebControl
{
    public string theValue = "hi"; 
}

<%= 和 <#= 表达式在 *.ascx 和 *.aspx 文件中工作 - 因为它们是动态生成的。.js、.html、.css 文件是静态的,因为结果表达式不起作用。作为表达式,您可以在 C# 上编写,其中 'this' - VisualWebPart1UserControl 类的实例。Visual Studio 智能感知将指导您。

于 2013-07-04T20:10:53.777 回答
1

您的 getMyValue() 应该与 asp/aspx 页面内联。而且您必须将 myClass.theValue 设为静态才能直接访问它。

于 2013-07-04T19:39:35.383 回答
0

我更喜欢使用HttpUtility.JavaScriptStringEncode

于 2013-09-24T12:28:36.040 回答
-1

确保您的 javascript 驻留在 ascx 文件中。

在类声明下的 VisualWebPart1UserControl.ascx.cs 中,您需要像这样声明一个变量:

受保护的 MyClassInstance = new myClass();

这将创建您的类的一个实例,由于访问器关键字“受保护”,您的 ascx 页面可以读取/访问该实例。

于 2013-07-04T20:16:42.830 回答