从JSON AJAX后不叫MVC5控制器操作 [英] MVC5 controller action not called from JSON AJAX Post

查看:209
本文介绍了从JSON AJAX后不叫MVC5控制器操作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从一个JavaScript应用程序将数据发送到MVC5控制器,但是当数据被提交到提交控制器动作,它永远不会被调用。我有一些它创建下列JSON对象很简单映射器:

I am sending data from from a javascript app to a MVC5 controller, however when data is submitted to the Submit controller action, it is never called. I have some very simple mappers which create the following JSON object:

function mapContactDto(vm)
{
    var contactDto = {};
    contactDto.firstName = vm.firstName();
    contactDto.lastName = vm.lastName();
    contactDto.companyName = vm.companyName();
    contactDto.emailAddress = vm.emailAddress();
    contactDto.phonePrimary = vm.phonePrimary();
    contactDto.phoneSecondary = vm.phoneSecondary();
    contactDto.address1 = vm.address1();
    contactDto.address2 = vm.address2();
    contactDto.city = vm.city();
    contactDto.postalCode = vm.postalCode();
    contactDto.country = vm.country();
    return contactDto;
}

function mapCartItems(vm)
{
    var cartItemsDto = new Array();
    $.each(vm.selectedOptions(), function (index, step, array) {
        var sku = step.selection().sku;
        if (sku !== "0") {
            cartItemsDto.push(sku);
        }
    });
    return cartItemsDto;
}

/* if i dump the object that is sent to the server with `console.log(JSON.stringify(item))` I get:

{
"skus": ["1001","8GB","201"],
"contact": {
    "firstName":"Jon",
    "lastName":"Doe",
    "companyName":"Yup my company",
    "emailAddress":"contact@me.com",
    "phonePrimary":"012111 231",
    "phoneSecondary":"",
    "address1":"1 Billing Way",
    "address2":"Navigation House",
    "city":"London",
    "postalCode":"112211",
    "country":"GB"
    }
}
*/

然后我用下面的code发送数据:

I then send the data with the following code:

var contactDto = mapContactDto(self.billingVm());
var cartItemsDto = mapCartItems(self.configurationVm());

var req = new XMLHttpRequest();
req.open('HEAD', document.location, false);
req.send(null);

var item = {
    skus: mapCartItems(cartItemsVm()),
    contact: mapContactDto(billingVm())
};

var url = '/Knockout/Submit';

$.ajax({
    cache: false,
    url: url,
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    data: item,
    type: 'POST',
    success: function (data, textStatus, jqXHR) {           
    },
    error: function (data, textStatus, jqXHR) { 
    }
});

我的控制器code是如下:

My controller code is below:

public JsonResult Submit(string[] Skus, ContactDto Contact)
{
    return Json(new { success = true, message = "Some message" });
}

/* and MVC models are: */

public class ContactDto
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string CompanyName { get; set; }
    public string EmailAddress { get; set; }
    public string PhonePrimary { get; set; }
    public string PhoneSecondary { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string PostalCode { get; set; }
    public string Country { get; set; }
}

我有以下问题请:

I have the following questions please:

  • 提交但永远不会被调用,如果我注释掉控制器参数,使其成为提交()则称为,这是为什么?

  • Submit is never called however, if I comment out the controller parameters so it becomes Submit() then it is called, why is this?

从以上,好像控制器架构无法匹配的参数 - 任何想法,我做错了,请

From the above, it seems like the controller framework cannot match up the parameters - any idea what I am doing wrong please?

如何在MVC控制器上启用调试,所以我可以看到这是怎么回事?

How to enable debugging on the MVC controller so I can see what's going on?

推荐答案

您将不得不做出两处修改: 字符串化的JSON作为如下:

You will have to make two changes: Stringify your Json as below:

$.ajax({
    cache: false,
    url: url,
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    data: JSON.stringify(item),
    type: 'POST',
    success: function (data, textStatus, jqXHR) {           
    },
    error: function (data, textStatus, jqXHR) { 
    }
});

二,只要标注你的方法与 [HttpPost] 如下:

[HttpPost]
public JsonResult Submit(string[] Skus, ContactDto Contact)
{
    return Json(new { success = true, message = "Some message" });
}

这篇关于从JSON AJAX后不叫MVC5控制器操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆