【问题标题】:Best way to pass parameters from server objects to JavaScript将参数从服务器对象传递到 JavaScript 的最佳方式
【发布时间】:2011-02-23 22:55:02
【问题描述】:

我渲染了一个带有表格的视图。表格的每一行都是一个可以编辑的对象。因此,该表的最后一列有一堆“编辑”按钮。单击这些 EDIT 按钮之一时,JavaScript 函数必须获取当前行表示的对象的 Id。最终,我希望得到一个干净的 HTML:没有“onclick”、“onmouseover”属性,也没有自定义属性。下面我有 2 个我不喜欢的例子。有什么好主意吗?

示例 1:

View.aspx

<td>
  <input type="button" value="EDIT" onclick="JSFunction(<%: ObjectId %>)" />
</td>

JavaScript

function JSFunction(id)
{
    //some code that does whatever with id
}

示例 2:

View.aspx

<td>
  <input type="button" value="EDIT" customAttribute="<%: ObjectId %>" />
</td>

JavaScript

$('input[type=button]').click(function() {
    var id = this.attr('customAttribute');
    //some code that does whatever with id
});

附:如果你能想出一个更好的问题标题,也请分享:)

【问题讨论】:

  • 您希望将 customAttribute 数据存储在哪里?一旦我们知道它在哪里,我们就可以弄清楚如何使用 jQuery 访问它。还是您希望将数据存储在服务器端并通过 AJAX 获取?
  • 自定义属性可以认为是干净的html。它们甚至在 HTML5 规范中 dev.w3.org/html5/spec/…
  • @mrtsherman - 我希望将它呈现到 HTML 服务器端,以便在客户端,JavaScript 可以获取该值。
  • @Yads - 非常有趣!我不知道这个。谢谢!

标签: javascript jquery html asp.net-mvc-2 unobtrusive-javascript


【解决方案1】:

我过去处理此问题的一种方法是使用 html5 数据属性。 jQuery 1.4.3 及以上版本均采用该格式。

<table>
    <tr class="row" data-rowInfo='{"Id": "1", "Name": "Jon"}'>
        <td>
            Row Id 1
        </td>
        <td>
            <input type="button" value="Edit"/>
        </td>
    </tr>
    <tr class="row" data-rowInfo='{"Id": "2", "Name": "Mark"}'>
        <td>
            Row Id 2
        </td>
        <td>
            <input type="button" value="Edit"/>
        </td>
    </tr>
    <tfoot>
        <tr>
            <td></td>
        </tr>
    </tfoot>
</table>

然后在您的 jquery 中,您可以执行以下操作:

$("input[type=button]").click(function(){
  var rowInfo = $(this).parents("tr.row").data("rowInfo");
  //Do something with rowInfo.Id;
});

通过使用 data 属性,您可以拥有一个丰富的 json 对象,它可以包含比属性更多的信息。此外,您只需声明一个数据属性即可保存所有相关信息。

jsfiddle 上工作的示例。

【讨论】:

  • 我之前实际上是在玩数据属性,但只是在 JavaScript 内部。这是在 HTML/aspx 中构建它的正确方法吗?如果我 FireBug 这个元素,我会看到那个数据属性持有什么吗?
  • +1 我正要回答这样的问题,但你公平地击败了我:)
  • @Dimskiy 我认为您可以使用 addons.mozilla.org/en-us/firefox/addon/firequery 在 Firebug 中检查数据元素
  • @Jimmy - 我安装了 FireQuery,但看不到 data 属性的值。我可以看到那里有一些东西,但不是确切的值。有诀窍吗? :) 也许是一个单独问题的好话题。
  • 当你在firebug中调试脚本并添加一个watch到$(this).parents("tr.row").data("rowInfo") 你可以看到json对象的内容。此外,如果您只是检查 firebug 中的元素,您应该能够看到原始 json 表示法。
【解决方案2】:

我这样做的方式是让服务器将 id 呈现给 &lt;tr&gt; 标记,您可以创建自己的属性或将其存储在 id 属性中。然后,如果您在 td 中有一个编辑按钮,您只需编写 jQuery 即可找到存储在 &lt;tr&gt; 标记中的 id。

html:

<tr myId="1">
<td>
  <input type="button" value="EDIT" />
</td>
</tr>

jQuery:

$(function() {
        $("input[type=button]").click(function() {
            var id = $(this).parent().attr("myId");
        });
    });

虽然我通常为我的编辑按钮分配一个“编辑”类,而不是按它们的类型来选择它们(因为我在页面上有一个保存按钮)。

【讨论】:

  • 谢谢!我也经常去上课。为了简单起见,没有在这里发布。那么,如果有超过 1 个参数,你会怎么做?将它们粘贴到 1 个字符串中并使用基于分隔符的 JavaScript 进行解析?服务器:
  • @Dimskiy,如果有多个参数,我会选择 Marks 答案。
【解决方案3】:

我会使用 jQuery 元数据插件,因为这样数据可以以多种不同的方式嵌入到任何元素中。通常的方法是像这样将它添加到类中:

<input type="button" class="button { objectId : <%: ObjectId %> }" /> 

【讨论】:

  • 我通常尽量不使用插件,除非我真的觉得我需要它们。例如,我肯定会使用 jQuery UI DatePicker 而不是自己实现一个。不过还是谢谢你的建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
相关资源
最近更新 更多