проверка на стороне сервера extjs4, как это сделать?

#c# #forms #validation #extjs4 #server-side

#c# #формы #проверка #extjs4 #на стороне сервера

Вопрос:

у меня есть форма в extjs, и мне нужно выполнить некоторые тесты проверки на стороне сервера и вернуть сообщение об ошибке, но я понятия не имею, как это сделать!

мне нужно проверить, существует ли уже новый добавленный IP-адрес

мне также нужно проверить, действительно ли это действительный адрес (у меня есть функция c #, которая может это сделать)

если эти условия в порядке, его можно добавить. если нет, я бы хотел показать пользователю сообщение об ошибке, в котором говорится, в чем проблема

теперь, когда я вызываю свою кнопку сохранения submit, я выполняю эти тесты на своем c # перед выполнением запроса insert, но даже если эти тесты не в порядке, в форме все равно сообщается об успехе, потому что я не знаю, как сообщить extjs4 об ошибке

редактировать это то, что я пытаюсь сделать до сих пор

моя форма отправки:

 this.up('form').getForm().submit
({
    url: 'AddData.ashx',
    params: { action: 'addip' },
    success: function (form, action) {
        Ext.MessageBox.show({ title: 'Success !',
            msg: 'IP added successfully<br />',
            icon: Ext.MessageBox.INFO,
            buttons: Ext.MessageBox.OK
        });

        Ext.getCmp('addipform').getForm().reset();
    },
    failure: function (form, action) {
        switch (action.failureType) {
            case Ext.form.action.Action.CLIENT_INVALID:
                Ext.Msg.alert('Failure', 'Form fields may not be submitted with invalid values');
                break;
            case Ext.form.action.Action.CONNECT_FAILURE:
                Ext.Msg.alert('Failure', 'Ajax communication failed');
                break;
            case Ext.form.action.Action.SERVER_INVALID:
                Ext.Msg.alert('Failure', action.result.msg);
        }
    }
})
  

внутри моего addData.ashx есть функция addip(), которая вызывается, когда параметр действия равен ‘addip’
, эта функция возвращает :

 public string addip()
{
   //my queries ...
   string result = new JavaScriptSerializer().Serialize("{    success:false,  errors:{    text:"The IP already exist!",  ip:"The is not an IP !"  }  }");
   return resu<
}
  

но ничего не происходит!

Ответ №1:

Прежде чем запустить и запустить его, пожалуйста, убедитесь, что у вас уже есть страницы, которые могут обслуживать запросы, подобные этим вызовам:

 Request: http://localhost/verify.aspx?ip=192.168.0.1
Response: {success: true, message: "The IP is correct"} //you can pass as much items as you want here

Request: http://localhost/verify.aspx?ip=127.0.0.1
Response: {success: false, message: "The IP is already exist!"}
  

Это звучит просто, верно?

Тогда в вашем ExtJS у вас может быть такой код (извините, если есть какая-либо синтаксическая ошибка, еще не проверял ее)

 var w = Ext.create('Ext.window.Window', {
    width: 300,
    height: 250,
    items: Ext.create('Ext.form.Panel', {
        items: [{
            xtype: 'textfield',
            fieldLabel: 'IP'
        }]
    }),
    buttons: [{
        text: 'Save',
        handler: function() {
            var ip = w.down('textfield').getValue();

            //Some client side validation first
            //then we submit it

            //Use Ajax request          
            Ext.Ajax.request({
                url: 'http://localhost/verify.aspx?ip=' ip,
                success: function(r) {

                    //r is the raw response object, we need to parse it
                    var res = Ext.decode(r.responseText, true);

                    //Then here we are. We can check the transaction
                    //status. This is the exact object you passed
                    //in the above Request-Response pair.
                    if (res.success) {
                        //ip is correct. Do your other stuff here
                    }else{
                        //ip is incorrect. You may want to show the error message
                        alert(res.message);
                    }

                }
            }); 
        }
    }]
});
  

Отказ от ответственности: это всего лишь простой пример, надеюсь, это поможет 🙂

Комментарии:

1. большое спасибо за ваш ответ. Я пытался заставить это работать, но, похоже, я даже не могу выполнять предварительные запросы ur! я могу выполнять свои запросы и получать ответ, как вы сказали, но я не знаю, как отправить его обратно в extjs, чтобы к нему можно было получить доступ через success: function(r) : (

2. Вам не нужно явно отправлять запрос обратно в Extjs. Что вам нужно сделать, так это убедиться, что ваш сервер может печатать объект json на экране по запросу. Когда ваш Ajax выполнит запрос, он автоматически установит соединение и прочитает все, что напечатано на странице ответа. Надеюсь, это понятно 🙂

Ответ №2:

Предполагая, что вы отправляете свою форму на C #, после того, как вы выполнили проверки, и если эти проверки завершатся неудачей, вам нужно будет вывести JSON в следующем формате:

 {
    success:false,
    errors:{
        field1:errorMsg1,
        field2:errorMsg2
    }
}
  

Здесь field1 — это имя поля, присутствующего в вашей форме, в котором вы хотите отобразить ошибку.

Вам нужно будет вывести этот JSON со стороны вашего сервера, как вы делаете, когда отвечаете на запрос Ajax, и это само пометит требуемое поле как недопустимое и покажет сообщение об ошибке при наведении курсора мыши на поле.

Надеюсь, это поможет.

Комментарии:

1. хорошо, если я все правильно понял.. я отправляю свой for на c # с параметром action, затем вызывается нужная мне функция, она возвращает строку с форматом, как показано на рисунке (при этом fiild1 соответствует свойству name поля формы правильно?), Затем я серилизую его, чтобы получить json. проблема в том, что ничего не происходит. не могли бы вы привести мне полный пример, ty

2. Можете ли вы увидеть JSON, полученный с сервера, в теле ответа? Есть ли какая-либо ошибка, которую вы видите? Проверьте, куда попадает ваш ответ — в успешной или неудачной функции отправки формы?

3. ошибки нет, в adddata.ashx я не вижу никакого ответа, я получаю сообщение об успешном завершении и добавляю ip в БД

4. Я предполагаю, что ваш JSON не отправляется в качестве вывода. Когда вы вызываете функцию addip, она возвращает результат, но тогда вы не печатаете этот вывод? Вам нужно будет распечатать этот JSON (то есть вывести его), чтобы его можно было использовать на стороне клиента. Кроме того, используете ли вы какой-либо инструмент, такой как Firebug, для проверки ответа на запросы?

5. хорошо, я добавил консоль. Строка записи (результат). по-прежнему ничего. я использую инструменты разработки Chrome