2012-07-20 21 views
6

bị biến dạng với nút có hành động. Tôi có một số btns mà tôi muốn biết paramaeter của nó. Trong hướng dẫn grails nó nói rằng nó sẽ như thế này:cách chuyển thông số sử dụng nút tác vụ trong grails

<g:actionSubmit action="action" value="${message(code: 'default.button.edit.label', default: 'Edit')}" params="['actionTaken':editPhone]"/> 

Tôi đã thử sử dụng thẻ remotelink, submitButton, submitToRemote nhưng không hoạt động. Tôi luôn bị vô hiệu khi tôi thử phân tích cú pháp trong bộ điều khiển của mình:

def action= 
    { 
     def actionTaken = params.actionTaken 
     def employeeId= params.employeeId 

     MySession session = MySession.getMySession(request, params.employeeId) 
     profileInstance = session.profileInstance 

     switch(actionTaken) 
     { 
      case "editPhone" : 
       isEditPhone=true 
       break 

      case "editEmail" : 
       isEditEmail=true 
       break 
     } 
     render(view:"profile", model:[profileInstance:session.profileInstance, isEditPhone:isEditPhone, isEditEmail:isEditEmail]) 
    } 

Tôi đang thiếu gì? mã params của tôi có sai không? Mã của tôi có phân tích cú pháp các thông số sai không? điều này chỉ giúp tôi trong vòng kết nối không có tiến bộ. Cứu giúp. cảm ơn.

+0

bạn đã thử ** **. Có lẽ tôi đã quên {} trên thuộc tính params, nếu nó không hoạt động, hãy thử đặt chúng như ** [{}] ** hoặc ** {[]} ** Tôi không nhớ lại nó như thế nào. Sry – axierjhtjz

Trả lời

7

Grails documentation không liệt kê params là một trong các thuộc tính được chấp nhận bởi actionSubmit.

thể tiêm các giá trị mà bạn muốn trong danh sách params của bạn trong bộ điều khiển bằng cách khai thác những gì mà thẻ thực làm:

def editPhone = { forward(action:'action', params:[actionTaken: 'editPhone'])} 
def editEmail = { forward(action:'action', params:[actionTaken: 'editEmail'])} 

Bạn cũng có thể chỉ muốn chỉ mã logic hoàn toàn tách biệt vào các hành động editPhoneeditEmail nếu điều đó làm cho mã của bạn sạch hơn.

Cập nhật Xem Code:

<g:actionSubmit action="editPhone" value="${message(code: 'default.button.edit.label', default: 'Edit')}" /> 
4

Thuộc tính params được phân tách như một bản đồ, nơi các phím được đối xử một chuỗi nhưng giá trị được coi là biểu thức. Do đó

params="['actionTaken':editPhone]" 

đang cố gắng để xác định khóa có tên actionTaken có giá trị từ biến có tên editPhone trong mô hình GSP. Vì không có biến nào như vậy bạn nhận được null. Vì vậy, sửa chữa là di chuyển dấu ngoặc kép:

params="[actionTaken:'editPhone']" 

sẽ đặt giá trị thành chuỗi "editPhone".

+2

Trên thực tế, tôi đã làm điều đó trước khi tôi đăng ở đây và vẫn còn null. :( – user742102

+0

Điều này không làm việc cho grails 2.0 –

0

Tôi chỉ có một vấn đề tương tự (tôi cần phải nộp xóa cùng với một id) và tìm thấy một giải pháp sử dụng "formaction" thuộc tính HTML5 cho trình-đầu vào. Chúng có thể được cung cấp một giá trị có thể bao gồm bộ điều khiển, tác vụ, thông số bổ sung, v.v.

Nói chung, để thêm thông số vào nút gửi như chỉnh sửa một đối tượng phụ cụ thể trên biểu mẫu sẽ trông như thế này:

<input type="submit" formaction="/<controller>/<action>/<id>?additionalParam1=...&additionalParam2=..." value="Action" > 

và trong ví dụ của bạn:

<input type="submit" formaction="action?actionTaken=editPhone" value="${message(code: 'default.button.edit.label', default: 'Edit')}" > 
2

bạn cũng có thể vượt qua các tham số bên trong POST dữ liệu sử dụng

<input type="hidden" name="actionTaken" value="editPhone" /> 

bên trong biểu mẫu. Sau đó, nó cũng có thể truy cập thông qua biến params. Nó phù hợp với tôi.

+0

Đây là câu trả lời đúng imho Bạn phải nhớ rằng ngữ cảnh của nằm trong một biểu mẫu và biểu mẫu sẽ được gửi đến hành động được liệt kê trong thẻ . – nby

0

Trong trường hợp của mình, tôi có một phần tử biểu mẫu đơn lẻ với nhiều tác vụ trên mỗi hàng của bảng (tức là các nút chỉnh sửa bảng dữ liệu). Điều quan trọng là gửi toàn bộ dữ liệu biểu mẫu để tôi không thể chỉ sử dụng liên kết. Cách nhanh nhất tôi tìm thấy để tiêm một tham số là với javascript. Không lý tưởng, nhưng nó hoạt động:

function injectHiddenField(name, value) { 
    var control = $("input[type=hidden][name='" + name + "']"); 
    if (control.size() == 0) { 
     console.log(name + " not found; adding..."); 
     control = $("<input type=\"hidden\" id=\"" + name + "\" name=\"" + name + "\">"); 
     $("form").append(control); 
    } 
    control.val(value); 
} 

nút của bạn có thể trông như thế này:

<g:each in="${objects}" var="object"> 
    ... 
    <g:actionSubmit value="edit" action="anotherAction" 
        onclick="injectHiddenField('myfield', ${object.id})"/> 
</g:each>