jquery排序表和guid存在问题
我有jquery排序表和guid存在问题,jquery,html,jquery-ui-sortable,Jquery,Html,Jquery Ui Sortable,我有 文本1 文本2 文本3 但是$('#测试列表')。可排序('serialize')是否生成如下字符串: 876e45a4-6a27-4f7b-95ca[]=9e2500f11801和79fbfdf7-e9b1-4e96-8e42[]=9e2400d2abb7和4df36ffb-561a-4eaa-9b1c[] 删除id的最后12个字符 知道为什么吗?两件事: 可排序。序列化的ID 您确定可排序的序列化的实现了您所期望的功能吗?根据,它希望每个可排序元素的ID的格式为setname\u
文本1
文本2
文本3
但是$('#测试列表')。可排序('serialize')代码>是否生成如下字符串:
876e45a4-6a27-4f7b-95ca[]=9e2500f11801和79fbfdf7-e9b1-4e96-8e42[]=9e2400d2abb7和4df36ffb-561a-4eaa-9b1c[]
删除id的最后12个字符
知道为什么吗?两件事:
可排序。序列化
的ID
您确定可排序的序列化的实现了您所期望的功能吗?根据,它希望每个可排序元素的ID的格式为setname\u number
。ID中应该有下划线,但会使用=
或-
;发件人:
默认情况下,它以“setname_number”格式查看每个项目的id,并输出类似“setname[]=number&setname[]=number”的散列。
…其格式必须为:“set_number”,例如,一个id属性为foo_1
,foo_5
,foo_2
的三元素列表将序列化为foo[]=1&foo[]=5&foo[]=2
您可以使用下划线、等号或连字符分隔集合和数字。例如foo=1
或foo-1
或foo\u 1
全部序列化为foo[]=1
(我的重点。)由于没有看到下划线(),很明显,它正在使用它看到的最后一个连字符(-
)
id
用于CSS的格式
另外,与CSS一起使用的id
值不能以数字开头;发件人:
在CSS中,标识符(包括选择器中的元素名称、类和ID)只能包含字符[a-zA-Z0-9]和ISO 10646字符U+00A1及更高,加上连字符(-)和下划线(33;);它们不能以数字开头,也不能以连字符后跟数字
(这些限制对HTML中的id
不适用,HTML中不能包含空格,如果给定,则必须至少有一个字符,但CSS的限制性更强。)
由于您在jQuery中使用CSS选择器,因此最好确保id
属性是有效的CSS。(也许您可以将它们预处理为“G”,后面是带破折号的GUID,转换为x
,诸如此类,因此ID是G876e45a4x6a27x4f7bx95cax9e2500f11801
等等。)然后您需要按照上面的说明给它们一个下划线和后缀。将其更改为$(“#测试列表”)。可排序('serialize')).replace(/=\[\]/g,“-”)
解决了这个奇怪的问题,但是在jQuery UI代码中使用长ID肯定有些奇怪。我会看得更远
更新
右键serialize()
例程中jquery.ui.sortable.js
中有问题的代码是:
<ul id="test-list" class="ui-sortable" >
<li id="876e45a4-6a27-4f7b-95ca-9e2500f11801">text1</li>
<li id="4df36ffb-561a-4eaa-9b1c-9e2500f16d6b">text2</li>
<li id="cc4a57d5-1567-403c-888f-9e2500f1c171">text3</li>
</ul>
这是一种故意的功能,它检测包含破折号(-)、等于或下划线的ID,并将它们视为数组值、左/右分隔数组和键值。也许可以使用条形码,或者修改serialize()
以供您使用。我也遇到了同样的问题。我解决这个问题的方法是更改视图的代码,将破折号字符替换为空字符串:
@foreach(模型中的var项目)
{
@项目.标题
}
注意:在我的情况下,我使用div而不是ul/li
我的javascript如下所示:
$(“div#divItems”)。可排序({
光标:“移动”,
更新:功能(事件、用户界面){
var容器=$(此);
var sequence=container.sortable(“serialize”,{key:“sequence”});
$.post(“@Url.Action(“EditSequence”)”),序列,函数(数据){
if(data.success){
container.fadeTo(“正常”,0,函数(){
容器。fadeTo(“正常”,1);
});
}否则{
警报(数据、消息);
}
});
}
});
注意:我将键更改为“Sequence”,fadeTo()组合用于向成功保存序列的用户提供视觉反馈
我的控制器操作方法如下所示:
//POST:/Showcase/EditSequence?序列=
[授权]
[HttpPost]
公共操作结果编辑序列(列表序列)
{
尝试
{
for(int i=0;i
模型绑定器负责将不带破折号的Guid字符串转换为绑定到序列参数的列表。对于like876e45a4-6a27-4f7b-95ca-9e2500f11801,您可以添加参数
$(items).each(function() {
var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
});
好的观点,虽然我很快就在他的问题上的每个连字符后用字母做了一个测试,但它仍然存在。@Orbling:我只是在编辑你在那里的评论,我认为问题在很大程度上(或更多程度上)与我答案的新的第一部分和第二部分有关。:-)@TJ当我发现什么是什么的时候,你改变了你的答案,说出了我说的话。尽管你非常明智地去看了文档,而我看了代码。对我来说唯一的好处是,如果需要连字符,我知道代码需要修改的地方。;-)您可以在视图中执行item.Id.ToString(“N”),作为.Remove()方法的替代方法。
$(this).sortable('serialize', {expression:(/(.+)[_](.+)/)})