【问题标题】:Reading C# property into JQuery code将 C# 属性读入 JQuery 代码
【发布时间】:2009-08-19 13:57:45
【问题描述】:

我正在尝试将 C# 属性的值从我的代码隐藏文件中读取到一些 JQuery 脚本中(见下文)。我编写的 JQuery 选择器访问 ASP.Net GridView,然后访问 gridview 中的 CheckBox 字段。 Whenever a checkbox is checked or un-checked the code is hit, but I need to access the C# property from the code behind to take the appropriate action based on the value of the property.

    $(".AspNet-GridView-Normal > td > input").click(function() {

        //Need to access the C# property here

        //Take action here based on the value of the C# property

     });

【问题讨论】:

  • 我是在 Rails 中完成的。 Rails 允许您向 AJAX 请求发送 javascript 响应 - 一旦收到该请求就会在客户端执行。但是,生成此 javascript 的代码可能具有任意嵌入的 ruby​​ 语句(例如,访问属性以确定输出)。您可以搜索 ASP.Net 是否支持类似的东西。 C# 属性仅存在于服务器端,因此此逻辑必须通过服务器端处理来完成。
  • 在单击复选框时是否需要修改值?因此,如果您从将 AvailableInstalls 设置为 10 开始,是否需要在单击复选框时增加/减少变量?
  • 是的,每次选中复选框时变量都需要递减,每次取消选中复选框时都需要递增。
  • 那么在这种情况下,由 Ben Duguid 更新和更新的 crescent fresh 提出的解决方案可能是最直接的方法。如果您需要在页面回发上获取 AvailableInstalls 变量的当前值,您可以将其与我的方法结合使用。所以本质上是不断更新隐藏字段的值,以便在回发时可以使用该值。

标签: c# asp.net jquery properties


【解决方案1】:

这可能是显而易见的,但后面的代码在执行 jQuery 代码的客户端上并不存在。您可以做的是将属性的值分配给服务器端的隐藏字段,以便当您需要在客户端使用 jQuery 检查它时,它将可用。因此,您可以在客户端执行以下操作。

标记:

<asp:HiddenField ID="hfValueINeedToKnow" runat="server"/>

代码背后:

hfValueINeedToKnow.Value = <some value>;

jQuery:

$("#<%= hfValueINeedToKnow.ClientID %>").val();

您可能需要进行一些小的更改以支持网格的每一行的值,但希望这能解释总体思路。

【讨论】:

  • 我在读取 HiddenField 的值时遇到问题,这是我用来访问它的 JQuery 代码:var availableInstalls = $("#") .val();我在后面的代码中的 PageLoad 方法中将隐藏字段的值设置为“2”,但是当我在调试模式下运行时,var AvailableInstalls 的值总是“未定义”。有什么想法可能导致这种情况吗?
  • @Russ Clark - 隐藏输入字段的 HTML 中出现了什么,以及 jQuery 选择器中实际呈现的值?
  • 切中要害,真的很有帮助。谢谢你。一段时间以来一直在寻找这种分解动作。
【解决方案2】:

您在评论中提到该值是 int。而且我看到它也是您的代码隐藏中的 public 属性。现在这很简单——您不需要转义该值,也不需要以某种迂回的方式访问它,并且您可以免费获得类型安全:

<script>
$(".AspNet-GridView-Normal > td > input").click(function() {

    var AvailableInstalls = <%= AvailableInstalls %>;

});
</script>

【讨论】:

  • 根据 OP 后面的评论“每次选中复选框时变量都需要递减,每次取消选中复选框时都需要递增”在函数外部声明 JS 变量,但这应该很好用。
【解决方案3】:

你不能。

您需要在某个元素(可能是隐藏字段)中呈现 C# 属性,然后以这种方式查看。

但请进一步解释:您要检查什么属性?

【讨论】:

  • 该属性只是后面代码中的一个int,像这样: public int AvailableInstalls { get;放; }
  • 对,做好隐藏字段的方式。 Mark Kanof 已经为您提供了执行此操作的确切代码。
【解决方案4】:

我过去为这种情况所做的是将我的代码值打印到标记中并将它的任何内容存储在 javascript 变量中,从而使其副本可用于客户端代码。这是一个愚蠢的例子,但希望它有意义:

<%
    var messsge = "Hello World!"
%>

<html>
<head>
<script type="text/javascript">
    function ShowMessage()
    {
        var msg = '<%= message %>';
        if(msg)
            alert(msg);
    }
</script>
</head>
</html>

【讨论】:

    【解决方案5】:

    没有真正干净的方法可以做到这一点。您最好的选择可能是使用 ASP.NET 中内置的ClientScript.RegisterClientScriptBlock 功能。 Here's a good primer.

    private int myValue;
    
    protected void Page_Load(object sender, EventArgs e) {
        ClientScript.RegisterClientScriptBlock(typeof(Page), 
            "vars", "<script>var myParams = { p1: " + myValue + ", p2: 'My Name' };</script>");
    }
    

    这会将提供的脚本放在您的页面上靠近表单的顶部。你也可以改变它。显然,它不是最漂亮的。你本质上是字符串连接不同的语言,但它会工作,并且对于简单的变量声明来说并不太粗糙。

    【讨论】:

      【解决方案6】:

      从脚本注入攻击和无法对 JavaScript 进行单元测试的角度来看,嵌入在 JavaScript 中的 ASP 总是让我感到紧张。

      这建立在一个较早的答案之上:

      <script type="text/javascript">
      $(".AspNet-GridView-Normal > td > input").click(function() {
      
          var AvailableInstalls = $("#MyHidden").val();
      
      });
      </script>
      

      您可以将其移至隐藏变量:

      <input type="hidden" id="#MyHidden" value="<%= AvailableInstalls %>" />
      

      但是这并不能解决注入问题。因此,您可以添加一个服务器端隐藏变量并通过 ASP.NET 中的 Page_Load 事件函数对其进行设置。

      (P.s. 您还需要在您的脚本标签中添加属性 type="text/javascript" 以使其成为有效的 HTML)。

      【讨论】:

        【解决方案7】:

        如果你将你的值放入一个 id 为 hfValueINeedToKnow 的 asp:HiddenField,那么在客户端检索这个值的最简单方法是

        var jsvar = $("[id$=hfValueINeedToKnow]").val();
        

        因此您也可以将此代码放在单独的 .js 文件中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-09
          • 1970-01-01
          • 1970-01-01
          • 2015-03-13
          相关资源
          最近更新 更多