【问题标题】:How to send grails <g:link> params as POST如何将 grails <g:link> 参数作为 POST 发送
【发布时间】:2014-07-24 06:07:43
【问题描述】:

当我使用时在我的应用程序中

 <g:link params=[:] />

参数显示在我不想要的 URL 中。 有没有像我们通过 POST 方法那样发送参数而不显示在 URL 中?

谢谢

【问题讨论】:

    标签: grails gsp


    【解决方案1】:

    g:link 是用于创建链接的标签,没有带有 POST 参数的链接之类的东西,当您通过表单或 ajax 请求提交数据时,POST 和 GET(与其他人一样)是 methods 可用的。

    取决于上下文,您可能会生成一个 ajax 调用或用于执行此操作的表单。

    <g:form controller="myController" action="myAction">
      <g:hiddenField name="myField" value="myValue" />
      <g:submitButton name="Submit" value="Submit" class="lnk" />
    </gform>
    

    【讨论】:

      【解决方案2】:
      <g:link class="btn btn-success"  id="class.id" onclick='UsingPost();'>SOME LABLE HERE </g:link>
      <script type='text/javascript'>
      function UsingPost(){
          jQuery.ajax({
              type:'POST',
              data:{"model":${pleaseUseTheModelyouHaveLoaded}"}, 
              url:'${createLink(action: 'save')}',
              success:function(data,textStatus){
              jQuery('#success').html(data);},
              error:function(XMLHttpRequest,textStatus,errorThrown){}
              });
      }
      </script>
      

      【讨论】:

      • 请注意,当使用链接创建 HTTP POST 请求时,用户可能会感到有些奇怪,因为链接(以及 HTTP GET)被关联为安全的和幂等操作。因此,它可以执行多次,这会导致相同的结果(无副作用)。另一方面,根据定义,HTTP POST 不是幂等且不安全的,因此没有人会认为多次执行它(就像您在此处提到的保存方法)。因此,底线是,GET / POST 的区别不应该仅仅因为 url 中的属性而进行。
      【解决方案3】:

      &lt;g:link&gt;&lt;/g:link&gt; 处理时变为&lt;a href=""&gt;&lt;/a&gt;,因此传递给 glink 的任何参数将始终在 url 中可用。 如果您不想在 url 中使用 then,则必须使用表单。

      【讨论】:

      • 除了使用表格,没有其他选择?
      • 你也可以尝试使用 WebSockets。在没有 HTTP 的情况下,有很多方法可以做到这一点。
      • 总有一些方法可以做事。但这取决于用例,如果您只需要使用一些参数来访问一个方法,那么在这种情况下它就不是一个很好的选择。
      【解决方案4】:

      最简单的方法是使用 jquery:

      <g:link id="my_link">This is my link</g:link>
      
      <script type='text/javascript'>
          $('#my_link').click(function() {
              $.post('/url_for_post_request');
          });
      </script>
      

      Grails 中还有 remoteLink 功能,但它已被弃用,因此最好避免使用它。

      另一种选择是使用表单。重要的事实是您可以在某处定义表单并将提交按钮放置在网站上的任何位置 - 您只需要使用g:actionSubmitform 属性:

      <g:form method="post" action="..." name="form-name">...</g:form>
      

      g:actionSubmit:

      <g:actionSubmit form="form-name" action="..." value="Label"/>
      

      【讨论】:

      • 感谢您的回复。在 g:actionSubmit 动作中,我们可以给完整的 url 参数吗?
      • 您可以使用g:formurl 属性。参数应作为表单中的隐藏字段传递。
      • 在 g:link 中应该是“elementId”而不是“id”。
      【解决方案5】:

      您可以将&lt;g:link params=[:] /&gt; 发送到控制器/动作,然后在动作中进行重定向。

      <g:link action="formSubmit" params="[id:3]">send</g:link>
      
      class TestController {
      
          def index() {
          }
      
          def formSubmit(Long id) {
              // you can use the id param, or add it to flash scope
              redirect action: "index"
          }
      }
      

      所以 id 参数不会显示在结果 url 中。

      【讨论】:

        猜你喜欢
        • 2011-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-03
        • 1970-01-01
        • 2016-05-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多