如何通过AJAX请求触发ASP.NET MVC4 Controller方法及解决反序列化报错
问题描述
调用AJAX请求触发Controller方法时收到报错:无法将消息反序列化为MessageContract类型FXM.Ordering.WS.Contract.BoCreateAffiliateRequest,因为该类型没有默认(无参数)构造函数。
相关代码
按钮代码
<div class="form-group"> <div> <input type="button" value="Create" class="btn btn-default" id="create-affiliate-button" /> </div> </div>
AJAX请求代码
$(function () { refreshGroups(); $('#create-affiliate-button').click(function (e) { console.log("blahblahblah"); var b = $("form").serialize(); console.log("formvalues", b); $.ajax({ url: "/en/AjaxUI/CreateAffiliate", type: "GET", dataType: "json", data: b, //error: function (jqXHR, exception) { // failMessage(); //} }); }); }); function refreshGroups() { var pltf = "MT4_LIVE"; var out = $('#MT4Group'); if (pltf != null && pltf !== "") { $.ajax({ url: '/' + window.currentLangCulture + '/BOLiveForms/GetPlatformGroupByFilter', data: { platform: pltf, currency: "", withId : true }, type: 'GET', beforeSend: function () { $('#tpLoader').show(); }, complete: function () { $('#tpLoader').hide(); }, success: function (data) { populateDropDown(out, data); } }); } else { out.empty(); out.append($('<option></option>').val('').html(window.defaultSelection)); } }
Controller接口代码
public JsonResult CreateAffiliate(NewAffiliateViewModel newAffiliateViewModel) { try { var res = BackOfficeServices.BoAddAffiliateUser(newAffiliateViewModel); return Json("success"); } catch (Exception e) { throw e; } }
已修改的NewAffiliateViewModel代码
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace FXM.BO.ViewModels { public class NewAffiliateViewModel { public NewAffiliateViewModel() { } public int Id { get; set; } public string AffiliateName { get; set; } public string Email { get; set; } public int Employee { get; set; } public int MT4Group { get; set; } } }
解决方案
- 你已经正确给
NewAffiliateViewModel添加了无参构造函数,当前报错指向的是FXM.Ordering.WS.Contract.BoCreateAffiliateRequest类型,这是BoAddAffiliateUser方法关联的WCF服务契约类,找到这个类的定义,和ViewModel一样给它添加一个公共的无参数构造函数即可解决反序列化报错。 - 额外优化建议:
- 提交表单的AJAX请求建议将
type改为POST,同时给CreateAffiliate方法添加[HttpPost]注解,避免GET请求的URL长度限制,也更符合接口规范。 - POST请求时可以在AJAX配置中添加
contentType: 'application/x-www-form-urlencoded; charset=UTF-8',确保表单序列化数据能被后端正确解析。
内容的提问来源于stack exchange,提问作者Tom Sawyer
相关产品推荐
相关产品推荐

