Your solution is fine. I have just few points for you.
One problem is the URL length. Different browsers have different limits. If you must do this and your URLs are approaching 2,000 characters in length than you might have problems. If your field names take up too much space, use a fixed field order instead. Leave out fields that doesn't need to be bookmarked. In extreme cases, consider using the gzip algorithm to compress your long URL. Then reencode that binary data in base64 using only characters that are legal in URLs. This comes with the cost of some CPU time when you unzip the URL again on the next visit.
An alternative is to store the state information in a file or a database. Then you can store only the identifier needed to look up that information again in the URL.