ASP.NET MVC 之各种jQuery提交模式实例

 

1.$.ajax提交

1). dataType: "json" 用于标识对response的数据做JSON序列化,即无需再做JSON.pase处理

2). contentType 用于设置Request Header的Content-Type值,与请求发送参数有关,相关知识: xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")表示表单提交,提交的数据是名值对的方式。普通的post请求发送到数据格式不固定,如果不标识的话,服务器无法知道具体的处理方式,所以只能通过获取原始数据流的方式来进行解析。而使用原生ajax请求时,如果不显示的设置Content-Type,那么默认是text/plain,这时服务器就不知道怎么解析数据了,所以才只能通过获取原始数据流的方式来进行解析请求数据。

3).  processData: false  默认值是true, 对象格式的请求参数会默认调用 jQuery.param() 请查询对象转成查询字符串。设置成false后,对象格式的请求参数会保留对象格式, 接着需要与 contentType: "application/json;charset=UTF-8",  data: JSON.stringify(requestParam)  配合使用, 而服务端需要coding对应的解析对象。

 1 var _data = { tableName: "movie", fieldName: "saveLocal" };
 2 $.ajax({
 3     url: "/Admin/Default/GetDictItem",
 4     type: "POST",
 5     data: JSON.stringify(_data), //必须处理
 6     processData: false,
 7     dataType: "json",
 8     contentType: "application/json",//和请求参数格式相一致,这里为Request Payload类型
 9     success: function (data) {
10         //var jsonData = JSON.parse(data).data;//因为第7行,所以无需处理
11         select = $('.saveLocal').select2({
12             tags: true,
13             //multiple: true,
14             //placeholder: "Select ...",
15             data: data.data
16         });
17     },
18     error: function () {
19 
20     }
21 });

其它:  contentType: "application/x-www-form-urlencoded;charset=UTF-8",//默认值,可以不写 当设置为这种值时,发现请求发送参数类型变成了Form Data,下面的服务代码依旧可以得到请求值.

Form Data
groupByName:TableName

服务端代码,以post Request Payload 方式发送请求参数, 必须告诉服务端怎样解析参数

public string GetDictItem(string tableName,string fieldName)
{
    tcfg_dictitemBLL dictitemBLL = new tcfg_dictitemBLL();
    List<SqlDbParameter> parms = new List<SqlDbParameter>();
    //List<tcfg_dictitemEntity> dictItemList = dictitemBLL.GetAlltcfg_dictitem(parms, "TableName,FieldName,OrderNumber");
    //字典:影片的保存位置
    List<tcfg_dictitemEntity> categoryByLocalSelect = dictitemBLL.GetDictitemEntity(tableName, fieldName);  //movie     saveLocal

    IDictionary info = new Hashtable();
    ArrayList selectOptionList = new ArrayList() { };
    selectOptionList.Add(new SelectOption { text = "请选择类别" });
    foreach (tcfg_dictitemEntity dictItemEntity in categoryByLocalSelect)
    {
        SelectOption option = new SelectOption { id = dictItemEntity.PropertyValue.Value, text = dictItemEntity.PropertyName };
        selectOptionList.Add(option);
    }
    info.Add("data", selectOptionList);
    return JsonConvert.SerializeObject(info);
}

例子2

var _data = {
    "dictItemID": dictItemID,
    "itemType": itemType,
    "itemName": itemName,
    "itemCode": itemCode
};
$.ajax({
    url: "/System/DictItemAdd",
    type: "POST",//此参数在这必须要设置,否则服务端无法获取参数值
    async: false,
    data: _data,
    dataType: "json",
    success: function (data) {
        if (data.result === "error") {
            alert(data.msg);
        }
        else {
            window.location.href = "..\\System\\DictItemManage";
        }
    },
    error: function () {
    }
});

对应的服务的代码

public JsonResult DictItemAdd()
{
    //...
    dictItem.ItemType = Convert.ToInt32(Request.Form["itemType"]);
    dictItem.ItemName = Request.Form["itemName"];
    dictItem.ItemCode = Request.Form["itemCode"];

    if (string.IsNullOrEmpty(Request.Form["dictItemID"]))
    {
        //...
        return Json(new { result = "", msg = "记录添加失败" });
    }
    else
    {
        //..
        return Json(new { result = "", msg = "记录更新失败" });
    }
}

 例子2

第6行:dataType:"json", 用于标识返回的数据格式是json,必须和服务端对应的方法返回值的类型对应.

第8行:和服务器有对应关系

 1 $.ajax({
 2     url: "/System/GetRoleMenuByRoloID",
 3     type: "POST",
 4     async: false,
 5     data: _data,
 6     dataType: "json",
 7     success: function (data) {
 8         var roleRecords = JSON.parse(data.result);
 9         for (var i = 0; i < roleRecords.length; i++) {
10             if (roleRecords[i].MenuID != null) {
11                 $("input[name='" + roleRecords[i].MenuID + "']").attr("checked", true);;
12             }
13         }
14     },
15     error: function () {
16        debugger
17     }
18 });
public JsonResult GetRoleMenuByRoloID(string roleID)
{
    //...
    DataTable dt = bll.GetRoleScope(parms);
    return Json(new { result = JsonConvert.SerializeObject(dt), msg = "" });
}

$.ajax单对象提交

var puzzleObj = GetFormInfo("puzzle");//封装一个JSON对象,它的属性与服务端方法参数对象属性保持一致(大小写)
puzzleObj.EnablePuzzleName = $("#EnablePuzzle").find("option[value='" + puzzleObj.EnablePuzzle + "']").text();
puzzleObj.CompanyID = $("#cid").val(); 
$.ajax({
    processData: false,
    url: "/Company/UpdateCompanyForPuzzle",
    type: "POST",
    contentType: "application/json",
    data: JSON.stringify(puzzleObj),
    success: function (data) {
        SetFormInfo("show", puzzleObj);
    },
    error: function () {
        debugger
    }
});
public string UpdateCompanyForPuzzle(tbiz_CompanyEntity entity)
{
    tbiz_CompanyBLL companyBLL = new tbiz_CompanyBLL();
    int result = companyBLL.UpdateCompanyPuzzleConfig(entity);
    return JsonConvert.SerializeObject(result);
}

//MVC默认会自动提取参数并封装成entity对象

$.ajax 提交 之processData: false,contentType: "application/json"

这个方式当服务端方法coding好对应的ViewModel,MVC默认是自动解析好提交参数的,对于这点的原理待学习

var _menus = [];
var checkbox = $("#table_module input[type='checkbox']");
for (var i = 0; i < checkbox.length; i++) {
    if ($(checkbox[i]).is(':checked')) {
        var scopeData = $(checkbox[i]).parent().find("input[type='hidden']").val();
        var menuID = $(checkbox[i]).attr("name");
        var menu = { "MenuID": menuID, "RoleID": roleID, "ScopeData": scopeData };
        _menus.push(menu);
    }
}
if (_menus.length > 0) {
    var _menusStr = JSON.stringify(_menus);
    $.ajax({
        processData: false,
        url: "/System/SaveRoleMenuByRoloID",
        type: "POST",
        contentType: "application/json",
        async: false,
        data: _menusStr,//提交前必须序列化
        dataType: "json",
        success: function (data) {
            window.location.href = "..\\System\\RoleManage";
        },
        error: function () {
            debugger
        }
    });
}

服务端

public JsonResult SaveRoleMenuByRoloID(IList<Menu> records)//定义与JS对应的Menu实体,MVC会自动解析提交参数

 

2.$.post

1).以jQuery的$.post方法提交请求, 并用JSON.parse()方法解析Action方法所返回的由JsonConvert.SerializeObject()方法所序列化的对象字符串结果

2).注意提交请求参数与接受参数的方式

function loadDictItem(obj) {
    var id = $(obj).attr("data-dictitemID");
    if(id !=="")
    {
        $.post("..\\System\\BindDictItemById", { "dictitemID": id }, function (data) {
            var dtResult = JSON.parse(data);
            $("#txtItemName").val(dtResult.ItemName);
            $("#txtItemCode").val(dtResult.ItemCode);
            $("#ItemType").prop("value", dtResult.ItemType);
        });
    }
}

//直接返回JSON格式字面值

public string BindDictItemById(string dictitemID)
{
    SystemBLL bll = new SystemBLL();
    tcfg_DictItemEntity dictItem = bll.GetDictItemByID(dictitemID);
    return JsonConvert.SerializeObject(dictItem);
}

3).$.post()可以直接解析由Action返回的JSON格式数据

function delDictItem(obj) {
    var id = $(obj).attr("data-dictitemID");
    if (id !== "") {
        $.post("..\\System\\DelDictItemById", { "dictitemID": id }, function (data) {
            if (data.result === "ok") {
                $(obj).parent().parent().remove();
            }
        });
    }
}
public JsonResult DelDictItemById(string dictitemID)
{
    SystemBLL bll = new SystemBLL();
    tcfg_DictItemEntity dictItem = bll.GetDictItemByID(dictitemID);
    dictItem.IsDelete = 1;
    string result = bll.UpdateDictItem(dictItem) > 0 ? "ok" :"fail";
    return Json(new { result = result, msg = "" });
}

 $.ajax 参数API

async: false,  //async. 默认是 true,即为异步方式
dataType: "json",
data: _data,//参数,_data可以是obj结构    
processData: false,
contentType: "application/json"    // 1)表示向服务端发送的参数的数据格式必须是json形式字符串,和data参数相关联;
// 2)不添加 contentType:“application/json“的时候可以向后台发送json对象形式的字符串;
// 3)当向后台传递复杂json的时候,同样需要添加 contentType:“application/json“,然后将数据转化为字符串;
// 如果不设置, 在ASP.NET MVC 用action 方法原生对象参数接受请求参数时,无法接收并解析参数

 参考

提交数组并接接收

function batchSeach() {
    var staffNameList = $("#staff_name_list").val();
    var staffArray = staffNameList.split("\n");
    var lengthNum = staffArray.length;
    //staffArray = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "L"];
    var limit = 5;//每页个数
    var pagenum = Math.ceil(staffArray.length / limit);//总页数
    for (var i = 0; i < pagenum; i++) {
        var curpage = i + 1;
        var start = limit * (curpage - 1);
        var perpage = staffArray.slice(start, start + limit);
        $.ajax({
            async: false,
            //processData: false,该方式下,不用设置此参数,否则后台解析不了参数
            type: "POST",
            traditional: true,
            dataType: "json",//返回类型已经是JSON
            url: "/Staff/Batch",
            data: { "names": perpage},
            success: function (data) {
                bindDataTable(data);
            },
            error: function () {
               
            }
        });
    }
    return;
}
public string Batch(List<string> names)
{
    for (int i = 0; i < names.Count; i++)
    {
    /* code */
    }
    return JsonConvert.SerializeObject(new { result = true, message = "",data= dataTable });
}

 当后端API方法返回dynamic 类型结果

//当API返回dynamic 类型结果时,前端相当于直接拿到了JSON数据类型,无效再JSON.parse
success: function (data) {
    //var _data = JSON.parse(data).data;
    var _data = data.data;
    artist_select = $('.search_artist').select2({
        placeholder: "Select ...",
        data: _data
    });
    edit_artist_select = $('.edit_artist').select2({
        placeholder: "Select ...",
        data: _data
    });
},
error: function () {

}

 

posted @ 2017-11-10 14:40  轴轴  阅读(2308)  评论(0编辑  收藏  举报