当前位置: 首页 > 面试题库 >

如何在React Admin包中显示服务器端验证发出的自定义错误消息?

慎志国
2023-03-14
问题内容

有什么方法可以使用https://github.com/marmelab/react-
admin
软件包执行服务器端表单验证?

这是AdminCreate组件的代码。它将创建请求发送到api。如果一切正常,Api将返回状态为422或状态码200的验证错误。

    export class AdminCreate extends Component {
  render() {
    return <Create {...this.props}>
        <SimpleForm>
          <TextInput source="name"  type="text" />
          <TextInput source="email" type="email"/>
          <TextInput source="password" type="password"/>
          <TextInput source="password_confirmation" type="password"/>
          <TextInput source="phone" type="tel"/>    
        </SimpleForm>
    </Create>;

}
}

因此,问题是,如何从服务器发送的错误对象中分别显示每个字段的错误?这是错误对象的示例:

{
errors: {name: "The name is required", email: "The email is required"},
message: "invalid data"
}

先感谢您!

class SimpleForm extends Component {
    handleSubmitWithRedirect = (redirect = this.props.redirect) =>
        this.props.handleSubmit(data => {
          dataProvider(CREATE, 'admins', { data: { ...data } }).catch(e => {
            throw new SubmissionError(e.body.errors)
          }).then(/* Here must be redirection logic i think  */);
        });

    render() {
        const {
            basePath,
            children,
            classes = {},
            className,
            invalid,
            pristine,
            record,
            resource,
            submitOnEnter,
            toolbar,
            version,
            ...rest
        } = this.props;

        return (
            <form
                className={classnames('simple-form', className)}
                {...sanitizeRestProps(rest)}
            >
                <div className={classes.form} key={version}>
                    {Children.map(children, input => (
                        <FormInput
                            basePath={basePath}
                            input={input}
                            record={record}
                            resource={resource}
                        />
                    ))}
                </div>
                {toolbar &&
                    React.cloneElement(toolbar, {
                        handleSubmitWithRedirect: this.handleSubmitWithRedirect,
                        invalid,
                        pristine,
                        submitOnEnter,
                    })}
            </form>
        );
    }
}

现在我有以下代码,它显示验证错误。但是问题是,成功后我无法执行重定向。有什么想法吗?


问题答案:

如果您使用的是SimpleForm,则可以将其asyncValidate与第97期评论中asyncBlurFields所建议的一起使用。我没有使用SimpleForm,所以这就是我能告诉你的。

我用过一个简单的form。您也可以在其中使用服务器端验证。这是我的方法。一个完整且可行的示例。

import React from 'react';
import PropTypes from 'prop-types';
import { Field, propTypes, reduxForm, SubmissionError } from 'redux-form';
import { connect } from 'react-redux';
import compose from 'recompose/compose';
import { CardActions } from 'material-ui/Card';
import Button from 'material-ui/Button';
import TextField from 'material-ui/TextField';
import { CircularProgress } from 'material-ui/Progress';
import { CREATE, translate } from 'ra-core';
import { dataProvider } from '../../providers'; // <-- Make sure to import yours!

const renderInput = ({
    meta: { touched, error } = {},
    input: { ...inputProps },
    ...props
}) => (
    <TextField
        error={!!(touched && error)}
        helperText={touched && error}
        {...inputProps}
        {...props}
        fullWidth
    />
);

/**
 * Inspired by
 * - https://redux-form.com/6.4.3/examples/submitvalidation/
 * - https://marmelab.com/react-admin/Actions.html#using-a-data-provider-instead-of-fetch
 */
const submit = data =>
    dataProvider(CREATE, 'things', { data: { ...data } }).catch(e => {
        const payLoadKeys = Object.keys(data);
        const errorKey = payLoadKeys.length === 1 ? payLoadKeys[0] : '_error';
        // Here I set the error either on the key by the name of the field
        // if there was just 1 field in the payload.
        // The `Field` with the same `name` in the `form` wil have
        // the `helperText` shown.
        // When multiple fields where present in the payload, the error  message is set on the _error key, making the general error visible.
        const errorObject = {
            [errorKey]: e.message,
        };
        throw new SubmissionError(errorObject);
    });

const MyForm = ({ isLoading, handleSubmit, error, translate }) => (
    <form onSubmit={handleSubmit(submit)}>
        <div>
            <div>
                <Field
                    name="email"
                    component={renderInput}
                    label="Email"
                    disabled={isLoading}
                />
            </div>
        </div>
        <CardActions>
            <Button
                variant="raised"
                type="submit"
                color="primary"
                disabled={isLoading}
            >
                {isLoading && <CircularProgress size={25} thickness={2} />}
                Signin
            </Button>
            {error && <strong>General error: {translate(error)}</strong>}
        </CardActions>
    </form>
);
MyForm.propTypes = {
    ...propTypes,
    classes: PropTypes.object,
    redirectTo: PropTypes.string,
};

const mapStateToProps = state => ({ isLoading: state.admin.loading > 0 });

const enhance = compose(
    translate,
    connect(mapStateToProps),
    reduxForm({
        form: 'aFormName',
        validate: (values, props) => {
            const errors = {};
            const { translate } = props;
            if (!values.email)
                errors.email = translate('ra.validation.required');
            return errors;
        },
    })
);

export default enhance(MyForm);

如果代码需要进一步说明,请在下面添加注释,我将尽力加以阐述。

我希望能够通过与调度所描述的onSuccess和onFailure处副作用的动作做的REST请求的动作在这里,但我无法得到这与共同努力SubmissionError



 类似资料:
  • 我在数据库上实现查询层,使用和Spring Boot项目在sql数据库上执行CRUD操作。在GraphQL模式中,我提到了一些必须的字段,当这些字段在查询中没有提到时,它会以默认格式返回状态代码的错误消息。 错误: 这是我的代码与层架构模式 控制器: 服务: 配置: BookDataFetcher: 上面的代码按预期工作,但我这里的问题是如何自定义错误消息?在错误消息中,我想提及状态,因为这是来自

  • 具有自定义验证的基本HTML5表单。如果提交的值不是数字,浏览器应显示错误消息“字段必须是数字”如果输入“abc”并按submit(或按enter键),该字段将标记为无效,但不会显示错误消息。再次按submit(或按enter)将显示消息。这种双重提交行为出现在Windows和OS X上最新版本的Firefox、Chrome、Safari和IE上。您会注意到默认的“此字段是必需的…”消息在第一次提

  • 我正在尝试用spring显示一个报告PDF,我终于得到了它,但是问题出现在我的代码中有一个异常或错误的时候。在这种情况下,我想在我的应用程序中显示特殊的消息。sping控制器返回一个带有文件pdf的ResponseEntity和一个http状态代码。

  • 如何在wordpress忍者表单插件中显示自定义错误消息。我已经搜索了忍者表格文件,但无法到达网站。默认情况下,错误消息显示为 我希望它是 提前道谢。

  • 当我们在OSB 12c中添加Validate Node以根据XSD验证传入请求时,如果验证失败,则在某些错误消息中会显示导致验证错误的字段名。但仅对于十进制值,错误消息只显示Invalid decimal Value,而没有提及引发错误的字段。我们能克服这个问题吗

  • 问题内容: 我想在jsp中显示针对Spring安全认证异常的自定义错误消息。 对于错误的用户名或密码, 对于禁用的用户, 我是否需要为此重写AuthenticationProcessingFilter?否则我可以在jsp本身中做一些事情以找到认证异常密钥并显示不同的消息 问题答案: 在Spring安全jar内的 messages.properties中 重新定义属性。例如,添加到类路径 myMes