使用spUrlRewrite的map参数映射表后,引起表单提交数据丢失

#1 GoolLong

问题现象:
我使用了 spUrlRewrite 功能,并且定义了 map 和 args
'map' => array(
  'login' => 'main@login',
),
'args' => array(
  'login' => array('act'),
),

如果我访问 /login/abc.html,控制器中可以用 $this->spArgs('act') 捕获到"abc";
但如果我用表单提交到 /login.html,即使表单中有 ,控制器中也无法用 $this->spArgs('act') 捕获到"abc";

(由于时间有限,我没仔细去读sp内核程序,所以以下的原因分析可能存在错误)
原因分析:
我大概跟踪了一下,使用 spArgs 时,spArgs 类中的 args 属性中已经将 act 的值置为空了,所以不能用 $this->spArgs('act') 来获取。估计是 spUrlRewrite 在分解url的参数时,得不到act的参数,所以置为空,并且影响了后面的 spArgs 类。

解决方法:
1、使用 $this->spArgs('act', '', 'post') 来获取;
2、表单提交地址直接使用 /login/abc.html。

建议:
如果url中没有map参数表中对应的参数值,就不应该修改 spArgs 类的 args 属性中对应的变量值。很简单的道理:
既要允许 /?m=main&a=login&act=abc 这种GET方式;
也要允许 /?m=main&a=login POST act=abc 这种方式。

请jake酌情考虑。

2011-05-24 00:31:29

#2 jake

spUrlRewrite对应的是spUrl生成的地址,所以只要在form的action里面使用spUrl,那么参数就可以传过去了,也就是楼主说的解决方法2。

这里产生这个问题,是因为楼主没有在form的action里面使用spUrl的地址,而是直接写上地址:“如果我用表单提交到 /login.html”,这样并不是sp所提倡的用法。sp是希望同一个应用里面全部的地址都用spUrl产生,以便可以适应各种地址模式。

当然,如果不使用spUrl,那么spUrlRewrite也无法获取到参数。

2011-05-24 07:29:11

#3 GoolLong

在模板中,我是使用的spUrl来生成地址的。

使用以下格式,就无法在控制器内直接用 $this->spArgs('act') 获得"abc"这个值



必须使用以下格式才行

2011-05-24 13:39:31

#4 GoolLong

我想描述的问题重点在于,在map参数映射表中配置了参数后,必须通过url把参数传进去,否则即使你在表单中有同名的参数,也是获取不到正确的值的。除非你在控制器中显式的指定从POST中获取数据。

2011-05-24 13:45:10

#5 jake

其实你理解错了spUrlRewrite的配置,如果你需要在get上面直接传输参数,那么可以不设置'login' => array('act'),这个映射,直接通过 /login.html?act=xxx 来get传递就可以,这也是方便ajax时候使用的。

'login' => array('act'), 里面的act是设置到地址里面的参数,所以一定要从“地址”里面获取,对吧,因为它连“参数名”也没有。

2011-05-24 14:04:14

#6 wind4

/login.html?act=xxx
最喜欢这种方式传值。

其实spUrlRewrite做的是URL重写。但是POST数据包中的数据已经不属于URL了。

2011-08-10 16:15:04

#7 wind4

/login.html?act=xxx
最喜欢这种方式传值。

其实spUrlRewrite做的是URL重写。但是POST数据包中的数据已经不属于URL了。

2011-08-10 16:15:58