//POST
        protected override DriverResult Editor(ContentPart part, HiddenStringField field, IUpdateModel updater, dynamic shapeHelper)
        {
            //require at least the "see" permission
            if (!_orchardServices.Authorizer.Authorize(HiddenFieldsPermissions.MaySeeHiddenFields))
            {
                return(null);
            }

            //to update, require the "edit" permission
            if (_orchardServices.Authorizer.Authorize(HiddenFieldsPermissions.MayEditHiddenFields))
            {
                var fs = field.PartFieldDefinition.Settings.GetModel <HiddenStringFieldSettings>();
                //tokenization happens in the handler
                var vm = new HiddenStringFieldDriverViewModel {
                    Field            = field,
                    Value            = field.Value,
                    Settings         = fs,
                    IsEditAuthorized = _orchardServices.Authorizer.Authorize(HiddenFieldsPermissions.MayEditHiddenFields)
                };
                if (updater.TryUpdateModel(vm, GetPrefix(field, part), null, null))
                {
                    field.Value = vm.Value;
                }
            }

            return(Editor(part, field, shapeHelper));
        }
        //GET
        protected override DriverResult Editor(ContentPart part, HiddenStringField field, dynamic shapeHelper)
        {
            //require at least the "see" permission
            if (AuthorizeSee(part, field))
            {
                return(ContentShape("Fields_Hidden_String_Edit", GetDifferentiator(field, part),
                                    () => {
                    var fs = field.PartFieldDefinition.Settings.GetModel <HiddenStringFieldSettings>();
                    //tokenization happens in the handler
                    var vm = new HiddenStringFieldDriverViewModel {
                        Field = field,
                        Value = field.Value,
                        Settings = fs,
                        IsEditAuthorized = AuthorizeEdit(part, field)
                    };
                    return shapeHelper.EditorTemplate(TemplateName: "Fields.Hidden.String.Edit", Model: vm, Prefix: GetPrefix(field, part));
                }));
            }

            // it is better to return an empty shape instead of null
            return(ContentShape("Fields_Hidden_String_Edit_Unauthorized", GetDifferentiator(field, part),
                                () => {
                return shapeHelper.EditorTemplate(
                    TemplateName: "Fields.Hidden.String.Edit.Unauthorized",
                    Model: new HiddenStringFieldDriverViewModel(),
                    Prefix: GetPrefix(field, part));
            }));
        }
        //GET
        protected override DriverResult Editor(ContentPart part, HiddenStringField field, dynamic shapeHelper)
        {
            //require at least the "see" permission
            if (!_orchardServices.Authorizer.Authorize(HiddenFieldsPermissions.MaySeeHiddenFields))
            {
                return(null);
            }

            return(ContentShape("Fields_Hidden_String_Edit", GetDifferentiator(field, part),
                                () => {
                var fs = field.PartFieldDefinition.Settings.GetModel <HiddenStringFieldSettings>();
                //tokenization happens in the handler
                var vm = new HiddenStringFieldDriverViewModel {
                    Field = field,
                    Value = field.Value,
                    Settings = fs,
                    IsEditAuthorized = _orchardServices.Authorizer.Authorize(HiddenFieldsPermissions.MayEditHiddenFields)
                };
                return shapeHelper.EditorTemplate(TemplateName: "Fields.Hidden.String.Edit", Model: vm, Prefix: GetPrefix(field, part));
            }));
        }