为什么MVC模型绑定正确解析复杂对象,如果请求是由POST发出的,如果由GET发出则不解决?

时间:2017-03-06 17:28:51

标签: c# .net ajax asp.net-mvc

在我的控制器中,我定义了一个Customer viewmodel类,如下所示。

有两个属性:FirstName,LastName和第三个属性Orders,它是Order

的集合
public class Customer
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public List<Order> Orders { get; set; }
}

public class Order
{
    public int OrderId { get; set; }
    public string OrderBy { get; set; }
}

public class TestController : Controller
{

    public ActionResult TestCustomer1(Customer customer)
    {
        return Json(customer);
    }
}

当客户端点击按钮并调用OnCustomerClick()

时,我通过ajax调用向控制器提交数据
function OnCustomerClick() {

    var complexObject = {
        FirstName: 'Saroj',
        LastName: 'K',
        Orders: [{ OrderId: 1, OrderBy: 'Saroj' }, { OrderId: 2, OrderBy: 'Kumar' }]
    };

    var obj = { customer: complexObject };
    var data2send = obj;
    $.ajax({
        type: "POST",
        url: 'TestCustomer1',
        data: data2send,
        success: function (arg) { //call successfull
        },
        error: function (xhr) {
            //error occurred
        }
    });
};

重点是当类型:POST 请求调用操作时,控制器操作中的Customer参数已成功填充,而当我通过类型调用操作时: GET 参数对象实例化,属性设置为null。

表示序列化对象的字符串在两种情况下完全相同,只改变字符串传递给action的方式:第一种情况下的body请求,第二种情况下的url参数。

在POST请求中请求正文 客户%5BFirstName%5D = Saroj&安培;顾客%5BLastName%5D = K&安培;顾客%5BOrders%5D%5B0%5D%5BOrderId%5D = 1&安培;顾客%5BOrders%5D%5B0%5D%5BOrderBy%5D = Saroj&安培;客户% 5BOrders%5D%5B1%5D%5BOrderId%5D = 2及客户%5BOrders%5D%5B1%5D%5BOrderBy%5D =库马尔

GET请求中的查询字符串 ?/ TestCustomer1客户%5BFirstName%5D = Saroj&安培;顾客%5BLastName%5D = K&安培;顾客%5BOrders%5D%5B0%5D%5BOrderId%5D = 1&安培;顾客%5BOrders%5D%5B0%5D%5BOrderBy%5D = Saroj&安培;客户%5B订单%5D%5B1%5D%5B订单%5D = 2&amp;客户%5B订单%5D%5B1%5D%5B订单%5D =库马尔

任何人都可以告诉我为什么模型绑定的行为会在两种情况下发生变化吗?

1 个答案:

答案 0 :(得分:1)

GET和POST请求之间的区别在于POST主体可以具有内容类型,因此可以在服务器端将它们正确解释为XML或Json,依此类推;对于GET,你所拥有的只是一个查询字符串。 因此,如果您将复杂类型作为查询字符串放在您的网址中,它就可以正常工作。 例如,查询字符串中的数组可能是这样的: http://SomeHost/GetArray?TestData[0].a=1&Data[0].b=1&Data[1].a=2&Data[1].b=2&Data[2].a=3&Data[2].b=3