jquery.form.js异步提交表单和上传文件

时间:2022-12-06 19:46:37

使用jquery.form.js需要从网上下载。

jquery.form.js提交form表单插件提供了表单ajaxe提交解决方案,下面对比一下使用jquery自己的ajax提交和jquery.form的提交由啥不同。
通常没有使用jquery.form插件的情况下我们可以像下面代码来提交表单:

//jquery ajax 方式提交表单

    var $form = $("#form"),

        action = $form.attr("action");

    $form.on("submit",function(){

        $.post(action,$form.serialize(),function(res){

            //请求成功代码在这里

            alert("提交成功!");

        },'json');

        return false

    });

====================================

 

//jquery.form.js ajax提交表单

$('#form2').submit(function() {

        $(this).ajaxSubmit(function() {

            alert("提交成功!");

        });

        return false; //阻止表单默认提交

    });

 

jquery.form.jsajaxSubmit()可以像上面代码一样只传递一个成功的回调函数,也可以传递更多参数,参数如下:

//jquery.form.js 中的ajaxSubmit() 可以是一个回调函数或者是更多参数,如下:

var options = {

    //data: {},                 //表单上传之外,自己随意写额外的参数

        //url: url,                 //默认是formaction

        //type: type,               //默认是formmethodget or post

        //dataType: null,           //html(默认), xml, script, json...接受服务端返回的类型

        //clearForm: true,          //成功提交后,清除所有表单元素的值

        //resetForm: true,          //成功提交后,重置所有表单元素的值

        //target: '#output',          //把服务器返回的内容放入idoutput的元素中

        //timeout: 3000,               //限制请求的时间,当请求大于3秒后,跳出请求

        //提交前的回调函数

        beforeSubmit: function(formData, jqForm, options){

            //formData: 数组对象,提交表单时,Form插件会以Ajax方式自动提交这些数据,格式如:[{name:user,value:val },{name:pwd,value:pwd}]

            //jqForm:   jQuery对象,封装了表单的元素

            //options:  options对象

            //比如可以再表单提交前进行表单验证

        },

        //提交成功后的回调函数

        success: function(data,status,xhr,$form){},

        error: function(xhr, status, error, $form){},

        complete: function(xhr, status, $form){}

    };

 

====================

下面我们来一段jquery.form表单提交的实战例子完整代码:

$('#formLogin').on("submit",function() {

        $(this).ajaxSubmit(

            {

                //url: url,                 //默认是formaction

                //type: type,               //默认是formmethodget or post

                //dataType: "json",           //html(默认), xml, script, json...接受服务端返回的类型

                //clearForm: true,          //成功提交后,清除所有表单元素的值

                //resetForm: true,          //成功提交后,重置所有表单元素的值

                target: '#output',          //把服务器返回的内容放入idoutput的元素中

                //timeout: 3000,               //限制请求的时间,当请求大于3秒后,跳出请求

                //提交前的回调函数

                beforeSubmit: function(arr,$form,options){

                    //formData: 数组对象,提交表单时,Form插件会以Ajax方式自动提交这些数据,格式如:[{name:user,value:val },{name:pwd,value:pwd}]

                    //jqForm:   jQuery对象,封装了表单的元素

                    //options:  options对象

                    //比如可以再表单提交前进行表单验证

                    console.log("beforeSubmit",arr,$form,options)

                },

                //提交成功后的回调函数

                success: function(data,status,xhr,$form){

                    console.log("success",data,status,xhr,$form);

                    if(data.Flag){

                        console.log(data.Content)

                    }

                },

                error: function(xhr, status, error, $form){

                    console.log("error",xhr, status, error, $form)

                },

                complete: function(xhr, status, $form){

                    console.log("complete",xhr, status, $form)

                }

            }

        );

        return false; //阻止表单默认提交

    });

 

以下是使用options,同时可以在beforeSubmit提交前进行验证,在success后显示结果提示或是否跳转

$(document).ready( function () {
  var options = {
   target: '#output1' ,
   // 从服务传过来的数据显示在这个div内部
  也就是ajax局部刷新
   beforeSubmit: showRequest,
  // ajax提交之前的处理
   success:  showResponse
  // 处理之后的处理
  };
  $( '#showDataForm' ).submit( function () {
   $( this ).ajaxSubmit(options);
   return false ;
   //非常重要,如果是false,则表明是不跳转
   //在本页上处理,也就是ajax,如果是非false,则传统的form跳转。
  });
});
function showResponse(responseText, statusText, xhr, $form) {
  alert(xhr.responseText+ "==" +$form.attr( "method" )+ 'status: ' +
  statusText + '\n\nresponseText: \n' + responseText);
//xhr:说明你可以用ajax来自己再次发出请求
//$form:是那个form对象,是一个jquery对象
//statusText:状态,成功则为success
//responseText,服务器返回的是字符串(当然包括html,不包括json)
}
function showRequest(formData, jqForm, options) {
  //formData是数组,就是各个input的键值map数组
  //通过这个方法来进行处理出来拼凑出来字符串。
  //formData:拼凑出来的form字符串,比如name=hera&password,
  //其实就是各个表单中的input的键值对,
  //如果加上method=XXXX,那也就是相当于ajax内的data。
  var queryString = $.param(formData);
  alert(queryString+ "======" +formData.length);
  for ( var i=0; i < formData.length; i++) {
  alert(formData[i].value+ "===============" +formData[i].name);
  }
  //jqForm,jquery form对象
  var formElement = jqForm[0];
  alert($(formElement).attr( "method" ));
  alert($(jqForm[0].name).attr( "maxlength" ));
  //非常重要,返回true则说明在提交ajax之前你验证
  //成功,则提交ajax form
  //如果验证不成功,则返回非true,不提交
  return true ;

}

 

个人代码:

   $("#form1").ajaxSubmit({

                                dataType: "json",//这个地方与控制器传过来的数据类型一致

                                type: "Post",

                             url: _rootUrl + "InputExcel/InputExcelData",//默认是form1action

data:{ 'filePath': strPath, 'tabName': $('#ddlInputTable').val(),}                               

success: function (data) {

                                    if (data.state == 1) {

                                        alert("导入成功!");

                                    } else {

                                        alert("导入失败!\r\n" + data.msg);

                                    }

                                }

                            })


 <input type="file" />

<form id="form1" method="post" enctype="multipart/form-data" >


不管上传文件还是导入excel数据,必须使用enctype="multipart/form-data":

因为如果不加这句话,获取的仅仅是本地此文件的路径,传到服务器端根本没办法使用客户端的文件路径。

加上这句就是以文件流的形式传送文件,在后台传文本框的内容得到的是本地文件路径。而使用

HttpPostedFileBase postFile = Request.Files["selPath"];

             string fileName = postFile.FileName;

获取的也仅仅是文件名,因为它并没有把文件上传到服务器的硬盘上,而是把文件以流的形式上传,同时也能得到文件名。我们使用流。

上传文件到服务器:

HttpPostedFileBase postFile = Request.Files["fileUp"]; 

string fileName = Path.GetFileName(postFile.FileName); 

  string dir = Path.Combine(Request.MapPath("~/FileUpload"), fileName ); 

  postFile.SaveAs(dir);//保存文件

读取excel流:

HttpPostedFileBase postFile = Request.Files["selPath"]; 

string fileName = Path.GetFileName(postFile.FileName); 

 Stream stream = postFile.InputStream; 

 byte[] bytes = new byte[postFile.ContentLength]; 

 stream.Read(bytes, 0, postFile.ContentLength);