2011-06-19 25 views
7

Khi sử dụng đối tượng lệnh có vẻ như tôi không nhận được tự động ràng buộc của các trường idgrails lệnh dữ liệu đối tượng liên kết của trường id

class somethingCommand { 

int id 
String A 
String B 

// some methods here like Domain.get(id) 

} 

My A và B chuỗi có được dữ liệu tự động một cách kỳ diệu binded từ các thuộc tính hình thức nhưng không phải id. Các "trường ẩn" khác của grails như phiên bản, dateCreated hoặc lastUpdated cũng bị ràng buộc chính xác.

giải pháp vá hiện tại của tôi là như sau: Tôi nghỉ mát để xác định một lĩnh vực id ẩn trong hình thức của tôi

<g:hiddenField name="blogId" value="${blog?.id}"/> 

Và đổi tên id để blogId trong obect lệnh và làm việc.

Điều này dường như không phù hợp với sự thanh lịch của Grails. Tôi đang thiếu gì trong các quy tắc ràng buộc dữ liệu của đối tượng Command vs controller?

+0

Được ID trước theo hình thức trước khi bạn thêm vào lĩnh vực ẩn? Nó có hoạt động với trường ẩn với tên = id không? Các thuật toán databinding sẽ cố gắng và kết hợp các lĩnh vực để tên tài sản - có lẽ có nhiều lĩnh vực id và nó đã nhầm lẫn? –

+0

Làm cứng lên Stéphane ... :) –

Trả lời

7

Theo dõi về vấn đề này:

Tôi chạy vào cùng một vấn đề: Tôi đã có một lệnh với một id tham số.Khi gọi bộ điều khiển của tôi trên một hành động sử dụng lệnh, tất cả các thông số đã được ràng buộc đúng cách trừ id.

Hóa ra là nếu bạn có một trường được gọi là phiên bản trong lệnh của bạn, trường id sẽ không được chỉ định.

Nếu bạn thay đổi tên trường phiên bản của mình cho trường khác (ví dụ: readVersion), thì ID sẽ được ánh xạ chính xác.

Hy vọng rằng sẽ giúp,

Vincent Giguere

+1

Theo dõi đây là một tính năng, tôi giả định lỗi lúc đầu. http://jira.grails.org/browse/GRAILS-6190 –

3

Tôi đã sử dụng vài lần này.

Tham số id được ràng buộc với lệnh của bạn như bất kỳ trường nào khác. Không có hành vi đặc biệt nào trên trường cụ thể này

Bây giờ, nếu bạn gửi giá trị cho trường id không tương thích với loại trường id của lệnh, thì trường sẽ không bị ràng buộc. Bạn sẽ không phải có được ClassCastException hoặc bất kỳ thứ gì sắp xếp. Bạn sẽ chỉ có một giá trị null cho trường.

Tôi nhớ nhìn thấy một cái gì đó khó khăn về điều đó: Nếu bạn có một id trong cả URL của bạn (ví dụ: điều khiển/hành động/id.) trong mẫu của bạn, sau đó id từ URL được ưu tiên.

Vì vậy, nếu mẫu của bạn có một trường ẩn thích hợp cho ID

<field type="hidden" name="id" value="1"/> 

nhưng hành động được bằng cách nào đó hơi say lên trên form

<g:form action="doSometing" id="some-incompatible-value">...</g:form> 

Những gì bạn sẽ nhận được trong bộ điều khiển là:

params.id = "some-incompatible-value" 

Điều này sẽ khiến cho grails không thể chuyển đổi thông số id của bạn thành dài hoặc một n int, và đối tượng lệnh của bạn sẽ có

command.id = null 

Vì vậy, lời khuyên của tôi sẽ là: bắt đầu lại một lần nữa và viết lại hình thức của bạn từ đầu và chắc chắn rằng giá trị trong bạn hình thành, như bạn thấy nó từ điều khiển của bạn của params.id tương thích với loại trường id của lệnh của bạn.

Hãy cho tôi biết cách thực hiện.

Vincent Giguère

Các vấn đề liên quan